Bonjour à tous,

Une petite question par rapport à JPA. Je travaille avec EJB3, Java6, JBoss 5.1.0 et un Eclipse EE pour Web Developers en version Helios. Nous utilisons des transactions CMT pour le moment.

Les différents couches de mon application n'ont rien d'innovant et sont :
- business (logique applicative travaillant sur des DTO)
- model (validation des valeurs des DTO)
- integration (persistence, transforme les DTO en entités pour des fonctions find(), insert(), update(), delete(), ...)
- integration.entity (objets entités)

Depuis ma couche applicative, après une logique métier complexe, je me retrouve à vouloir enregistrer différentes listes d'objets DTO (généralement en update() plutôt qu'en insert(), admettons qu'il n'y a que des mises à jour). Je dois le réaliser au sein d'une et une seule transaction.

Auriez-vous des directives à me conseiller pour réaliser ça ?

Je ne comprends pas comment, depuis ma couche applicative, initialiser une transaction que je passe ensuite à chaque appel à ma couche d'intégration. Je n'ai pas d'objet EntityManager au niveau de mon service applicatif, en tout cas pour le moment.

La fin de mon code applicatif ressemble à ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
for(PersonDTO person: persons){
	personIntegrationService.save(person);
}
for(VehiculeDTO vehicule: vehicules){
	vehiculeIntegrationService.save(vehicule);
}
... autres appels de persistence
Comment faire pour que "save()" ne fasse pas de commit lorsque la fonction se termine ?
Y a-t-il moyen de faire ça en restant en CMT ?
Ou dois-je obligatoirement changer les transactions de l'application pour passer de CMT à BMT et réaliser le begin() et commit() dans la couche applicative ?
Et dans ce cas, j'aurais besoin d'obtenir un objet UserTransaction dans ma couche applicative, ne serait-ce donc pas contraire aux bonnes pratiques ?

Je cherche avant-tout une façon propre et maintenable, sinon je peux toujours réaliser un service d'intégration particulier pour lequel j'utilise des transaction BMT et qui prend autant de listes de DTO en paramètres que j'ai d'objets DTO différents et qui persiste le tout entre un begin() et un commit(). C'est pour le moment la seule façon que je vois, mais il y a probablement nettement mieux.

Merci d'avance pour vos suggestions.