2010-05-10 2 views
2

Je développe une application utilisant Eclipselink et dans le cadre de l'application, je dois être capable de manipuler certains des objets qui implique le changement de données sans qu'il soit persisté à la base de données (fusionner/modifier des objets pour certains processus de génération de lots). Je suis réticent à modifier les données dans les objets Entity, car il existe un risque que même si je n'ai pas marqué les méthodes comme @Transactional, cette méthode pourrait à l'avenir être appelée par inadvertance à partir d'une méthode transactionnelle et ces changements pourrait être persisté.Forcer une méthode à être non-transactionnelle dans JPA (Eclipselink)

Donc, ma question est, y a-t-il un moyen de contourner ce problème? Tels que forcer une méthode à toujours être non-transactionnel indépendamment; terminer toute transactionalité dès que la méthode est démarrée;

Je sais qu'il existe une méthode .detach() qui peut détacher les objets de l'Entity Manager, cependant, il y a beaucoup d'objets et cela semble être une erreur de sécurité potentiellement sujette aux erreurs sur mon code.

+0

tag soit ressort ou ejb – Bozho

Répondre

4

Si cela est spring, vous avez

@Transactional(propagation=Propagation.NOT_SUPPORTED) 

Execute non transactionnellement, suspend la transaction en cours si l'on existe. Analogue à l'attribut de transaction EJB du même nom.

Si c'est EJB, vous avez un attribut de transaction du même nom. Quoi qu'il en soit, au lieu de jouer avec des transactions, vous pouvez simplement cloner votre objet et modifier les données requises. Le clonage profond peut être réalisé via commons-lang SerializationUtils.

1

Je ne suis pas sûr de comprendre votre cas d'utilisation mais je ne plaisante pas avec la transaction ici et soit:

  • Pas merge modifications apportées aux entités ou ~ ~
  • refresh toute modification apportée aux entités devant un merge (mais pourquoi voulez-vous appeler merge?) ~ ou ~
  • travail sur les copies non gérés des entités ou ~ ~
  • Déclare certaines classes sont en lecture seule (E clipseLink spécifique, voir Declaring Read-Only Classes et How to Use the @ReadOnly Annotation). De la doc:

    Toute modification apportée dans une instance gérée dans une transaction ou dans une instance détachée et fusionnée n'aura aucun effet dans le contexte d'une classe d'entités en lecture seule.

Questions connexes