2010-03-24 4 views
1

Je pense que c'est à peu près le cas le plus simple pour mapper une carte (c'est-à-dire un tableau associatif) d'entités.Le plus simple des cas de mappage dans Hibernate ne fonctionne pas dans MySQL

@Entity 
@AccessType("field") 
class Member { 
    @Id 
    protected long id; 

    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY) 
    @MapKey(name = "name") 
    private Map<String, Preferences> preferences 
      = new HashMap<String, Preferences>(); 
} 

@Entity 
@AccessType("field") 
class Preferences { 
    @ManyToOne Member member; 
    @Column String name; 
    @Column String value; 
} 

Cela semble devoir fonctionner, et c'est le cas, dans HSQL. En MySQL, il y a deux problèmes: Tout d'abord, il insiste pour qu'il y ait une table appelée Members_Preferences, comme s'il s'agissait d'une relation many-to-many. Deuxièmement, cela ne fonctionne tout simplement pas: puisqu'il ne remplit jamais Members_Preferences, il ne récupère jamais les préférences.

[Ma théorie est, puisque je n'utilise HSQL en mode mémoire, il crée automatiquement Members_Preferences et n'a jamais vraiment besoin de récupérer la carte des préférences. Dans tous les cas, que ce soit Hibernate a énorme bug dans ou je fais quelque chose de mal.]

Répondre

3

Et bien sûr, je transpire le problème pendant des heures, le poster ici, et une minute plus tard ...

Quoi qu'il en soit, la réponse est l'élément mappedBy de l'annotation @OneToMany:

@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="member") 
@MapKey(name = "name") 
private Map<String, Preferences> preferences 
     = new HashMap<String, Preferences>(); 

Ce qui fait un certain sens: quel champ dans les nombreuses entités repointe à l'entité One? Même en admettant que la recherche d'un champ @ManyToOne correspondant était trop sujette aux erreurs, je pense que ce qu'ils ont fait (en supposant l'existence d'une table de mappage) est encore pire.

Questions connexes