2010-03-13 15 views
2

J'ai une entité qui contient une collection. La collection est une relation unidirectionnelle OneToMany stockant qui a vu un fichier particulier. Le problème que j'ai est que, après que je charge l'entité et essayer de mettre à jour la collection, je ne reçois pas d'erreur, mais la collection est jamais mis à jour:Hibernate, EHCache, cache en lecture-écriture, ajout d'un élément à une liste

Entité:

@OneToMany(cascade = CascadeType.PERSIST) 
@JoinTable 
protected List<User> users; 

Fichier Servlet

@In 
private EntityQuery<File> File_findById; 

... 

File file = File_findById(fileId); 
file.getUsers().add(user); 
session.update(file); 

Même si j'appelle session.update(file) et je vois des choses dans les journaux de mise en veille prolongée, je ne vois rien dans la base de données indiquant qu'il a été enregistré.

Walter

+1

Utilisez-vous gérée par conteneur ou la persistance des transactions manuelles? Dans ce dernier cas, commettez-vous la transaction correctement? –

+1

Est-ce JBoss Seam? – skaffman

+0

Oui, c'est JBoss Seam. –

Répondre

1

Utilisez accès à la propriété au lieu d'un accès sur le terrain à cause de cela permet sale Contrôle automatique par Hibernate et utilisez @Cascade (CascadeType.SAVE_UPDATE) au lieu

@OneToMany 
@JoinTable 
@Cascade(CascadeType.SAVE_UPDATE) 
public List<User> getUsers() { 
    return this.users; 
} 

salutations,

1

Pourquoi cassez-vous l'opération persist (create) uniquement si vous souhaitez également fusionner fusion/mise à jour?

avec annotations EJB3/JPA, vous voudrez peut-être ajouter un autre type cascading:

  • CascadeType.MERGE

Ou peut-être même:

  • CascadeType.ALL (qui couvre également les opérations spécifiques Hibernate comme save-update, lock)

Si vous souhaitez utiliser des extensions Hibernate, vous pouvez utiliser l'annotation @Cascade à cascade:

  • SAVE_UPDATE