2010-11-10 5 views
3

J'ai un des deux catégories suivantes:joinTable est perdu

@Entity 
class A { 
    @Id 
    private aId; 
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinTable(name = "AB", joinColumns = @JoinColumn(name = "aId", referencedColumnName = "aId"), inverseJoinColumns = @JoinColumn(name = "bId", referencedColumnName = "bId")) 
    private Set<B> bSet; 
} 

@Entity 
class B { 
    @Id 
    private bId; 
} 

je charge la structure complète de l'objet d'une base de données et puis bascule dans une nouvelle transaction sur la seconde base de données de persister à nouveau la structure. Cependant, la table "AB" est laissée vide. C'est très étrange car "B" est persistant bien que je persiste seulement explicitement "A". J'ai vérifié que A-objects contient des ensembles non vides de B, donc ce n'est pas un problème. Cela me laisse avec la conclusion qu'Hibernate pense que la table "AB" devrait exister car "A" et "B" ont déjà leurs clés primaires. Y at-il un moyen de contourner cela afin que Hibernate puisse conserver la table de jointure dans la deuxième base de données?

+0

J'ai maintenant testé ceci avec EntityManager.merge() au lieu de EntityManager.persist(), et cela fonctionne. Mais je ne suis toujours pas sûr pourquoi la persistance ne fonctionne pas ... –

+0

Quel est le type des champs AID et BID? La façon dont vous avez posté ici entraînerait une erreur de compilation. –

Répondre

0

Je suppose que cela se produit parce que vous utilisez un objet proxy. Si vous créez des instances de A et B avec un nouvel opérateur, puis appelez persist, l'enregistrement de table Join sera créé .Mais vous utilisez l'objet provenant de entitymanager (ce sont des objets proxy) donc vous devez fusionner l'objet de cette façon entitymanager créera de nouveaux proxys de ces objets.

Questions connexes