Bulldozer de la cartographie pour Hibernate objet de DTO
J'essaie d'utiliser des Bulldozers pour convertir mon domaine entité DTO objets.
Donc, je veux convertir PersistentList, PersistentBag, ... de mon entité de domaine à la liste de tableaux, ... dans mon DTO objets pour éviter les paresseux problème.
Ceci est un exemple de deux de mes entité de domaine :
public class User {
private Collection<Role> roles;
...
}
public class Role {
private Collection<User> users;
...
}
Mon DTO les objets sont les mêmes, sauf que la classe sont des types de DTO. Donc, pour convertir de domaine à la DTO des objets, j'utilise la suite de Nivellement, de la cartographie :
<configuration>
<custom-converters>
<converter type=com.app.mapper.converter.BagConverter">
<class-a>org.hibernate.collection.PersistentBag</class-a>
<class-b>java.util.List</class-b>
</converter>
</custom-converters>
</configuration>
<mapping>
<class-a>com.app.domain.User</class-a>
<class-b>com.app.dto.UserDTO</class-b>
</mapping>
<mapping>
<class-a>com.app.domain.Role</class-a>
<class-b>com.app.dto.RoleDTO</class-b>
</mapping>
BagConverter est un Bulldozer convertisseur personnalisé et c'est son code :
public class BagConverter<T> extends DozerConverter<PersistentBag, List>{
public BagConverter() {
super(PersistentBag.class, List.class);
}
public PersistentBag convertFrom(List source, PersistentBag destination) {
PersistentBag listDest = null;
if (source != null) {
if (destination == null) {
listDest = new PersistentBag();
} else {
listDest = destination;
}
listDest.addAll(source);
}
return listDest;
}
public List convertTo(PersistentBag source, List destination) {
List listDest = null;
if (source != null) {
if (destination == null) {
listDest = new ArrayList<T>();
} else {
listDest = destination;
}
if (source.wasInitialized()) {
listDest.addAll(source);
}
}
return listDest;
}}
Donc, je reçois un objet Utilisateur qui contient un PersistentBag avec des rôles. J'applique dozer mappeur de la carte sur l'objet pour obtenir UserDTO objet. Le résultat que j'ai obtenu correspond à un UserDTO objet avec une liste de tableaux de Rôle et pas une liste de tableaux de RoleDTO comme je le souhaitais.
Je pense que même si j'ai utilisé convertisseur personnalisé, dozer vous permet de convertir le contenu de ma liste. Ce n'est pas la bonne façon ? Si non, comment faire pour convertir mon domaine entité dto objet en remplaçant persitent collections classiques java collections ?
Merci pour votre aide.
Sylvain.
OriginalL'auteur sylsau | 2010-05-13
Vous devez vous connecter pour publier un commentaire.
Malheureusement, lorsque vous vous inscrivez unCustomConverter
vous prenez l'entière responsabilité pour le mappage d'un objet (de la collection dans votre cas), y compris l'ensemble de son contenu, les propriétés des éléments, etc.Comme je le vois maintenant (je n'ai pas vu ça avant, il doit y avoir une sorte de nouvelle fonctionnalité). Il y a une possibilité d'utiliser
MapperAware
interface comme décrit à la fin de chapitre Personnalisées de Type Convertisseurs Dozer docs. Je suppose que c'est exactement ce que serait la suite de vos besoins.OriginalL'auteur Grzegorz Oledzki
- Je obtenir la dernière phrase, mais je ne comprends pas pourquoi vous devez traiter avec des
o.h.c.PersistentBag
(et ainsi de suite) étant donné que cette classe est unList
. Suffit d'utiliser quelque chose comme ceci:Et d'effectuer la conversion avant de détacher les entités (c'est la clé de votre problème).
List
une interface, par exemplewasInitialized()
.Mon objectif principal est de transférer les DTO objet de la couche de présentation qui est en GWT donc hibernate collections ne sont pas prises en charge pour la sérialisation par GWT. Donc, j'ai enseigné à convertir les collections hibernate dans le classique java collections pour éviter ce problème.
Oui, je le conçois. Mais je ne vois pas comment traiter avec
PersistentBag
ne résout rien. Vous avez juste besoin de faire la conversion lorsque les Entités sont encore attachés.OriginalL'auteur Pascal Thivent
J'ai aussi testé une autre solution sans convertisseur personnalisé comme ça :
Il y a un autre problème. Quand les Bulldozers d'essayer de convertir les rôles de l'Utilisateur pour les rôles de RoleDTO dans UserDTO, je suis un paresseux initialisation exception de veille prolongée parce que les rôles de l'Utilisateur est DÉSIREUX de mode.
Donc, je ne sais pas comment faire de la cartographie. Je continue à chercher un moyen de résoudre ces problèmes
Salut Pascal, qu'entendez-vous par faire la conversion, avant de détacher les entités? Tu veux dire faire de la cartographie dans les transactionnel couche?
OriginalL'auteur sylsau
Comme dit Pascal, je ne comprends pas le point de l'utilisation de PersistentBags directement. Si dans votre @Entity POJO vous déclarez votre liste de rôles comme un classique
java.util.List
puis Hibernate utilise automatiquement sa représentation interne. C'est aussi la raison alors que vous ne pouvez pas utiliser votre POJO dans le processus de sérialisation. Pour clarifier:Maintenant, lorsque vous souhaitez convertir votre Entité POJO dans la DTO de l'objet, vous avez juste à utiliser la cartographie proposée par Pascal, alias
de faire la conversion, avant la clôture de la transaction afin d'éviter l'initialisation d'exception, par exemple:
Que je petite remarque, j'ai utilisé des Bulldozers pour la même raison, et ce était le travail comme un charme.
pas sûr de comprendre votre question complètement, mais oui. Fondamentalement, lorsque vous convertissez des
UserDTO
àUser
vous n'envisagez pas de base de données. Ensuite (et c'est le deviner) lorsque vous mettez à jour les données dans la base de données,Hibernate
prendra soin de fusion de votre entité avec une sauvés et mise à jour de la base de données: bien sûr, dans votre cas, vous voulez d'abord les convertir deUserDTO
àUser
et puis vous voulez exécuter les appels à la db. Sur Hibernate opérations: journaldev.com/3481/...Merci pour votre réponse! L'approche décrite serait de travailler avec la méthode de org.dozer.Mappeur#map(source de l'Objet, Classe<T> destinationClass), mais cela suppose que tous les attributs sont mappés dans la DTO (dans le cas contraire, les attributs qui n'est pas mappé sera annulé). Si certains de ces attributs sont exclus de la cartographie, je pense que l'autre méthode org.dozer.Mappeur#map(source de l'Objet, de l'Objet de destination) [où l'objet de destination est l'entité extraites de la base de données] serait de travailler. Cependant, il ne semble pas fonctionner correctement avec la Collection d'attributs [rôles de l'attribut dans l'exemple ci-dessus]
OriginalL'auteur ThanksForAllTheFish