4

Entity1 と Entity2 の 2 つのエンティティが 1 対多の関係にあります。Entity1 には、エントリを含むマップがあります。

マップ上にいくつかの Entity2 を持つ新しい Entity1 を永続化するために使用するコードは次のようになります。

   Entity1 e1 = new Entity1();  
   Entity2 e2 = null;  
   e1.setE2s(new HashMap<String, Entity2>());
   for (String key : someKeySet()){
      e2 = new Entity2();
      e2.setCode(key);                      
      e2.setSwhon(true);        
      e2.setE1(e1);
      e1.getE2s(key, e2);       
      em.persist(e1.getE2s().get(key));         

    }       
    em.persist(e1);
    em.flush();

エンティティの抜粋は次のとおりです。

@Entity
@Table(name = "wm_Entities1")  
public class Entity1 implements Serializable {  
   private static final long serialVersionUID = 6592708276573465599L;  
   private Map<String, Entity2> e2s;
   private Long id;  
   @Id  
   @GeneratedValue(strategy=GenerationType.TABLE)  
   public long getId() {  
    return id;  
   }  
   public void setId(long id) {  
    this.id = id;  
   }  
   public void setE2s(Map<String, Entity2> e2s){    
    this.e2s = e2s;
   }       
   @OneToMany(mappedBy = "e1", fetch = FetchType.EAGER)  
   public Map<String, Entity2> getE2s() {  
    return e2s;  
   }  
}

@Entity
@Table(name = "wm_Entities2")
public class Entity2 implements Serializable {  
    private static final long serialVersionUID = -6131765066573346790L; 
    private long id;
    private Entity1 e1;
    @Id
    @GeneratedValue(strategy=GenerationType.TABLE)
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
    @ManyToOne()
    @JoinColumn(name="e1_id")
    public Entity1 getE1() {
        return this.e1;
    }
    public void setE1(Entity1 e1) {
        this.e1 = e1;
    }
}

pgデータベースに両方のエンティティを挿入するため、これはうまくいくように見えますが、問題は、データベースにe2のMapKeyを作成して保存していないことです(理論的にはJPAがこのキーを生成します)ので、e1を取り戻すと、そこからe2sマップを取得しようとしましたが、次のものがあります。

javax.ejb.EJBException: org.hibernate.HibernateException: コレクションのインデックス列が null です:

この MapKey を保存するにはどうすればよいですか??

注: JPA/Hibernate で JavaEE を使用し、JBoss 4.2 で実行し、PGSQL DB を使用しています。

4

1 に答える 1

2

コードにはいくつかの奇妙な点があります...しかし、Entity1に@MapKeyアノテーションを追加する必要があるようです。

(snippet)
@OneToMany(mappedBy = "e1", fetch = FetchType.EAGER)
@MapKey(name="iCantFigureTheRightPropertyName")
public Map<String, Entity2> getE2s() {  
    return e2s;  
}  
于 2009-01-20T11:42:26.317 に答える