2010-09-30 17 views
2

J'ai trois entités dans mon système - dont l'un doit être mis à jour lorsque les champs sur les deux autres sont changés:En utilisant Hibernate/JPA Event Listener de mettre à jour une entité lorsque d'autres entités sont mises à jour

@Entity 
public class Order { 
    private String name; 
    private Integer quantity; 
    private String status; 
} 

@Entity 
public class OrderLocation { 
    private String status; 
    private String desc; 
} 

@Entity 
public class OrderKey { 
    private String generatedKey; 
} 

Ainsi, après tous les champs sur Order ou OrderLocation sont modifiés, je dois régénérer la clé (en code), puis la sauvegarder dans OrderKey.

Je regardais EntityListeners pour ce faire, mais je ne savais pas s'il fallait utiliser les versions JPA ou Hibernate. J'aimerais utiliser les annotations idéalement.

Toute orientation serait très appréciée - merci d'avance.

Répondre

0

Je désapprouve vraiment une telle solution. Dans le projet dans lequel je travaille, nous utilisons des gestionnaires spéciaux qui effectuent tout le traitement. Les gestionnaires doivent savoir quelles entités doivent être mises à jour en cas de modifications. Par exemple. utiliser une couche abstraite qui gère la mise à jour de la base de données. Dans le cas où il y a des changements à Order ou OrderLocation, alors il gère la mise à jour de OrderKey.

Si vous utilisez des écouteurs, vous risquez également d'avoir des problèmes avec les boucles. Donc, je suggère d'utiliser des gestionnaires au lieu de listerners au sein des entités. Mais au cas où vous voudriez utiliser un tel mécanisme, vous devriez essayer @PrePersist et @PreUpdate afin d'invoquer une méthode capable de gérer les changements de l'entité.

+0

Salut Robert - pourriez-vous s'il vous plaît fournir votre solution de créer un gestionnaire qui peut s'asseoir indépendant de JPA et toujours écouter des événements? Mon cas d'utilisation est - il y a 2 entités qui ont des dépendances d'événement postPersist l'une sur l'autre, ce qui pourrait potentiellement entraîner une dépendance circulaire. Nous utilisons Eclipselink comme fournisseur JPA, donc nous avons une option pour utiliser l'événement descripteur et ses changesets. Mais je préférerais la logique plus proche de la classe d'entité plutôt qu'une couche d'événement de persistance globale. – tipsytopsy