代码之家  ›  专栏  ›  技术社区  ›  Mg.

jpa/hibernate/pg映射问题

  •  4
  • Mg.  · 技术社区  · 16 年前

    我有两个实体,实体1和实体2,一对多关系。在Entity1上,我有一个包含条目的映射。

    我用于在地图上保留带有某些实体2的新实体1的代码如下:

       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的map key(理论上jpa生成这个key),所以当我取回e1,并尝试从中获取e2s映射时,我有一个:

    javax.ejb.ejb异常: org.hibernate.hibernateexception:空 集合的索引列:

    如何保存此mapkey??

    注意:我在jpa/hibernate中使用javaee,运行jboss 4.2,使用pgsqdb。

    1 回复  |  直到 12 年前
        1
  •  2
  •   Nicolas    16 年前

    你的代码中有一些奇怪的地方…但似乎应该在entity1中添加@mapkey注释:

    (snippet)
    @OneToMany(mappedBy = "e1", fetch = FetchType.EAGER)
    @MapKey(name="iCantFigureTheRightPropertyName")
    public Map<String, Entity2> getE2s() {  
        return e2s;  
    }