2010-07-29 5 views
1

Je crée une application où les gens pourront poster des commentaires ou des articles, et les utilisateurs pourront noter si l'article leur a été utile ou non.Utiliser Hibernate pour se joindre aux tables

J'ai actuellement deux entités qui ressemblent à ce (détails non pertinents omis):

Article.java 

@Entity 
Article 

@Id 
private int article_id 

@ManyToOne 
@JoinColumn(name="user_id") 
private User user; 

User.java 
@Entity 
User 

@Id 
private int user_id 

Je veux un moyen de savoir si oui ou non un utilisateur a « voté » sur un article pour deux raisons, 1. de ne pas les laisser voter deux fois, 2. de suggérer d'autres articles qui pourraient être utiles.

J'ai expérimenté avec cependant, relation @OneToMany dans chaque objet avec une option Cascade chaque référence à l'article et l'utilisateur de mettre à jour l'objet que j'ai appelé User_Article (qui a seulement deux colonnes, article_ID et user_id), je continue à avoir un LazyInitilizationException quand la cascade se produit?

Je suis à la recherche de tous les gourous hibernation à des conseils sur la mise en œuvre et l'architecture sur ce problème.

Répondre

1

Essayez

@OneToMany(fetch=FetchType.EAGER) 

Cependant, il est bon d'éviter le chargement avide de grandes collections. C'est pourquoi laissez-le paresseux, et l'initialiser en utilisant Hibernate.initialize(..) seulement quand vous êtes sûr que vous en aurez besoin. Ou utilisez une requête HQL comme:

SELECT entity FROM Entity entity JOIN entity.collection 
+0

merci pour votre réponse. Je vais ajouter cela à mon code, cependant, de votre point de vue architectural, est-ce une bonne façon de gérer ma situation? Je pense que cela peut être exagéré, cependant, je ne peux pas trouver une raison suffisante. –

+0

voir ma mise à jour .. – Bozho

+0

Merci! Je commençais à être un peu accroché à l'aspect session de l'application. Je suppose que je vais mettre à jour la collection de "votes" juste avant que la couche de service ne retourne à mon contrôleur. –