2010-05-10 4 views
3

Je suis en train de rafraîchir la relation @ManyToMany mais il devient plutôt éclairci ...JPA @ManyToMany d'un seul côté?

Ma classe de projet ressemble à ceci:

@Entity 
public class Project { 
    ... 
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinTable(name = "PROJECT_USER", 
    joinColumns = @JoinColumn(name = "PROJECT_ID", referencedColumnName = "ID"), 
    inverseJoinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID")) 
    private Collection<User> users; 
    ... 
} 

Mais je n'ai pas - et je ne veux pas - la collection de projets dans l'entité Utilisateur.

Lorsque je regarde les tables de base de données générées, elles semblent bonnes. Ils contiennent toutes les colonnes et les contraintes (clés primaires/étrangères).

Mais quand je persiste un projet qui a une liste d'utilisateurs (et les utilisateurs sont toujours dans la base de données), la table de mappage n'est pas mise à jour est mise à jour mais lorsque je rafraîchis le projet, la liste de Les utilisateurs sont effacés.

Pour une meilleure compréhension:

Project project = ...; // new project with users that are available in the db 
System.out.println(project getUsers().size()); // prints 5 
em.persist(project); 
System.out.println(project getUsers().size()); // prints 5 
em.refresh(project); 
System.out.println(project getUsers().size()); // prints 0 

Alors, comment puis-je rafraîchir la relation entre l'utilisateur et le projet?

Répondre

1

L'erreur semble être dans le code que vous avez quitté avec ...

Je suppose ce projet a effectivement fait sortir de la base de données (ce qui persisteront une noop), sinon vous devriez obtenir une mise en veille prolongée exception lorsque vous essayez d'actualiser une entité qui n'a pas encore été validée.

Il semble y avoir juste une certaine confusion ici à propos de la différence entre JDBC et ORM et ce que fait réellement EntityManager. em.persist n'est pas un insert SQL ou une mise à jour SQL. Il dit «prenez cette nouvelle entité et mettez-la dans l'état géré». Habituellement cela conduit finalement à une insertion SQL, mais ce n'est pas ce que cela signifie au niveau de l'application. On dirait que vous dites essentiellement hiberner "J'ai fait quelques changements à cela, la prochaine fois que la session est synchronisée s'il vous plaît persistez, oh, vous savez quoi, j'ai changé d'avis, revenir à ce qui est dans la base de données. " em.persist ne met directement rien dans la base de données, ce qui est probablement encore "rien". Essayez de lancer un em.flush avant votre actualisation et vous devriez voir vos utilisateurs.

(Vous avez pas dit quoi que ce soit sur la façon. Votre session est configurer ou comment vous gérez les transactions, donc je suppose que tout cela est en une seule transaction)

+0

grâce ... (em.flush) a fait l'affaire! –

+0

On est curieux de savoir quelle est la fonctionnalité que vous essayez d'atteindre? Expérimenter avec c'est une enquête académique intéressante sur la façon dont fonctionne ORM, mais je ne sais pas pourquoi vous voulez vraiment le faire. – Affe

+0

pour UnitTesting ... –