2009-12-22 3 views
0

Je voudrais implémenter quelque chose comme un modèle PDO en conjonction avec Spring. Tous les objets de domaine sont implémentés en fonction de leur interface. Chaque implémentation d'objet de domaine a également une implémentation DAO autowired pour être capable de persister directement l'objet. (par exemple, foo.persist()). Cela fonctionne plutôt bien, Spring insère également la bonne implémentation DAO.Détresse avec Hibernate et Spring et Dynamic Proxies

Pour créer ces beans, j'ai implémenté une BeanFactory qui crée simplement les Beans à l'aide de Spring. Néanmoins Spring crée des proxies dynamiques et c'est là que le problème commence. Une fois que j'ai une relation many-to-one et que j'obtiens deux objets Dynamic Proxy différents. Quand il persiste, Hibernate me dit:

"n'a pas pu obtenir une valeur de champ par l'effet de réflexion".

L'interface des deux objets est défini comme suit:

public interface Client { 
public Long getId(); 
public void setId(Long id); 
} 

L'interface de l'utilisateur est définie comme suit:

public interface User { 
public Long getId(); 
public Client getClient(); 
public void setClient(Client client); 
public void setId(Long id); 
} 

La mise en oeuvre de l'utilisateur se fait en fonction de l'APP , J'ai utilisé la balise targetEntity pour créer un lien vers la bonne implémentation de l'objet Client. Néanmoins, la persistance ne fonctionne pas lors de l'insertion d'un objet Client qui a été créé via Spring. J'espère que quelqu'un de votre côté peut vous aider à résoudre ce problème.

Cordialement

Matthias

+0

En quoi cela ne fonctionne-t-il pas? Avez-vous une exception? Quelle? –

+0

Pour les curieux, j'ai trouvé un article de modèle PDO à http://www.theserverside.com/patterns/thread.tss?thread_id=33387 – KLE

+0

Martin fowler a également une entrée de blog à ce sujet (http: //www.martinfowler. com/bliki/AnemicDomainModel.html). Mais contrairement à l'article ServerSide, il précise (5ème paragraphe) qu'il ne préconise pas de mélanger la couche de persistance dans les objets du domaine. – KLE

Répondre

2

Tu ne mettez pas vos objets de domaine dans le contexte du printemps. C'est un anti-pattern. Il n'est pas nécessaire que les objets du domaine soient gérés au printemps.

Comment créez-vous un tel objet? En appelant le context.getBean() ou en les injectant. Le premier cas est moche (et nécessite que les objets de domaine soient de portée prototype, ce dernier ne fonctionnera pas, car la portée par défaut de tous les beans est singleton - c'est-à-dire que vous aurez le même objet à chaque fois. Séparez vous DAO de vos objets de domaine - c'est un must.Les objets de domaine ne doivent être rien de plus que des POJO annotés - pas d'interface Après avoir indiqué ce qui ne va pas avec votre code et comment le réparer correctement, je vais vous aider à le corriger de manière incorrecte, mais ne le faites que dans le cas où la date limite est demain, ou il est un énorme projet d'héritage d'un re n'ont pas droit à une architecture.

Si vous utilisez (dans votre applicationContext.xml)

<aop:config proxy-target-class="true"> 
</aop:config> 

Ensuite, vos cours seront prolongés par CGLIB (au lieu de procurations dynamiques), et leurs propriétés et méthodes est susceptible d'être préservée. Mais gardez à l'esprit que c'est juste faux.

+0

Salut merci pour cette réponse. Comment procéderiez-vous si vous souhaitez insérer l'implémentation dao dans l'objet domain, de sorte que vous puissiez directement appeler l'objet client.persist() alors que l'implémentation passera l'objet propre à l'implémentation dao insérée par spring. Si je crée directement l'objet domaine, l'autowiring pour le dao que je voudrais avoir comme propriété privée dans l'objet domaine ne fonctionnera pas. –

+0

Exécutez le DAO dans la couche Service, pas dans l'objet de domaine. En d'autres termes - Autowire le DAO dans la classe où vous appelez "client.persist()", et appelez dao.persist (client) à la place. – Bozho

+0

Eh bien, c'est exactement l'un des problèmes. Je voudrais avoir la couche de service dans l'objet lui-même, de sorte que l'objet ait une méthode persistante. Quelque chose comme Client client = nouveau Client(); client.setName ("Test"); client.persist(); est-ce un modèle qui n'est pas habituel avec Spring et ne peut pas être implémenté? –

Questions connexes