2009-01-19 5 views
4

J'ai deux entités, Entity1 et Entity2, sur une relation un à plusieurs. Sur Entity1 j'ai une carte qui contient des entrées.Problème de carte avec JPA/Hibernate/PG

Le code que j'utilise pour persister une nouvelle Entité1 avec quelques Entity2 sur la carte est comme ceci:

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

et voici une exctract des entités:

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

Cela semble fonctionner correctement car il insère les deux entiti es sur la base de données pg, mais le problème est qu'il ne crée pas - en sauvegardant la MapKey de l'e2 sur la base de données (théoriquement JPA génère cette clé), donc quand je récupère l'e1, j'essaye d'obtenir la map e2s , je l'ai un:

javax.ejb.EJBException: org.hibernate.HibernateException: null colonne d'index pour collection:

Comment puis-je obtenir ce MapKey sauvé ??

Remarque: J'utilise JavaEE avec JPA/Hibernate, sur JBoss 4.2, avec DB PGSQL.

+0

Est-ce une faute de frappe sur la ligne 3? L'entité ne devrait-elle pas être e1? – laz

+0

En outre, répondre à cette question nécessiterait de voir comment les entités persistantes sont annotées. – laz

+0

a corrigé l'erreur et ajouté le code de classe d'entités persistantes. –

Répondre

2

Il y a quelques bizarreries dans votre code ... Mais il semble que vous devez ajouter une annotation dans @MapKey Entité1:

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

Thx, il me manquait ça !. –