2009-06-05 9 views
13

Existe-t-il un moyen de mapper une méthode usine dans Hibernate (au lieu que Hibernate appelle un constructeur par défaut et définit de façon réfléchie les propriétés ou les champs)?Puis-je demander à Hibernate de créer un objet en usine?

Et s'il ne peut pas être mappé, Hibernate fournit-il un point d'ancrage pour la création d'objets personnalisés classe par classe?

Merci!

Répondre

2

Take a look à UserType. Vous devez appeler votre usine dans nullSafeGet() et remplir tous les champs vous-même. Le travail inverse est fait dans nullSafeSet().

2

Et si elle ne peut pas être mis en correspondance, ne Hibernate fournir un crochet pour la création d'objets personnalisés sur une catégorie par classe ?

Extrayez les écouteurs d'entité. Ceux-ci ajoutent seulement les annotations qui vous aideront. Pensez @PrePersist ou @PostLoad.

9

Ceci est faisable en utilisant soit:

Je pense que l'approche Interceptor est plus facile. Voici la javadoc du Interceptor.instantiate():

/** 
* Instantiate the entity class. Return <tt>null</tt> to indicate that Hibernate should use 
* the default constructor of the class. The identifier property of the returned instance 
* should be initialized with the given identifier. 
* 
* @param entityName the name of the entity 
* @param entityMode The type of entity instance to be returned. 
* @param id the identifier of the new instance 
* @return an instance of the class, or <tt>null</tt> to choose default behaviour 
*/ 
public Object instantiate(String entityName, EntityMode entityMode, Serializable id) throws CallbackException; 
+0

Aucune de ces solutions n'aborde la partie «Réfléchir ensemble sur les propriétés ou champs» de la question. –

0

Je ne sais pas si je comprends exactement ce que vous demandez, mais je pense qu'une solution est décrite ici (voir la solution 4 - Interceptor Hibernate, méthode onLoad): «Conception pilotée par domaine avec Spring et Hibernate» http://www.jblewitt.com/blog/?p=129

+0

Non, onLoad ne permettra pas de changer la façon dont Hibernate instancie les entités, ce qui est la question. –

+0

Je pensais que la question demandait comment peupler ces objets aussi, et autant que je peux voir, Interceptor.instantiate n'obtient aucune valeur de paramètre, seulement le nom de la classe et l'id de l'objet – cdarwin