views:

560

answers:

1

I have two entities, Entity1 and Entity2, on a one to many relationship. On Entity1 I have a map which contains entries.

The code I use to persist a new Entity1 with some Entity2 on the map is like this:

   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();

and here is a exctract of the entities:

@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;
    }
}


This seems to work fine since it inserts both entities on the pg database, but the catch is that it is not creating-saving the MapKey of the e2 on the database (theoretically JPA generates this key), so when I get the e1 back, and I try to get the e2s map from it, I have a:

javax.ejb.EJBException: org.hibernate.HibernateException: null index column for collection:

How can I get this MapKey saved??

Note: I'm using JavaEE with JPA/Hibernate, running over JBoss 4.2, with PGSQL DB.

+2  A: 

There are some oddities in your code... But it seems that you should add a @MapKey annotation in Entity1:

(snippet)
@OneToMany(mappedBy = "e1", fetch = FetchType.EAGER)
@MapKey(name="iCantFigureTheRightPropertyName")
public Map<String, Entity2> getE2s() {  
    return e2s;  
}
Nicolas
Thx, I was missing that!.
Mg