我想结合Spring实现类似PDO模式的东西。所有域对象都是根据其接口实现的。每个域对象实现还具有自动装配的DAO实现,以便能够直接持久化该对象。 (例如foo.persist())。这很好用,Spring也会插入适当的DAO实现。
为了创建这些bean,我实现了一个BeanFactory,它只是在Spring的帮助下创建了Beans。然而,Spring创建了动态代理,这就是问题的开始。一旦我有多对一的关系,我就会得到两个不同的动态代理对象。坚持不懈时,Hibernate告诉我:
“无法通过反射吸气器获取字段值”。
两个对象的界面定义如下:
public interface Client {
public Long getId();
public void setId(Long id);
}
用户的界面定义如下:
public interface User {
public Long getId();
public Client getClient();
public void setClient(Client client);
public void setId(Long id);
}
用户的实现是根据JPA进行的,我使用标记targetEntity链接到客户端对象的正确实现。然而,当插入通过Spring创建的Client对象时,持久化不起作用。希望你身边的人可以帮助解决这个问题。
此致
的Matthias
答案 0 :(得分:2)
您只是不将域对象放在spring上下文中。这是一种反模式。 Spring不需要管理域对象。
如何创建这样的对象?通过调用context.getBean()
或注入它们。前一种情况很丑陋(并且需要域对象属于范围prototype
,后者只是不起作用,因为所有bean的默认范围是singleton
- 即你将得到相同的每次都是对象。否则,您将需要所有bean都具有范围prototype
,以便拥有域对象的新实例。
将DAO与域对象分开 - 这是必须的。域对象应该只是带注释的POJO - 不需要任何接口(在一般情况下)。
在告诉您代码有什么问题以及如何正确修复代码之后,我会帮助您不正确地修复代码。但是,只有在截止日期是明天,或者这是一个巨大的遗留项目无权重新架构时才这样做。
如果您使用(在applicationContext.xml
中)
<aop:config proxy-target-class="true">
</aop:config>
然后您的类将由CGLIB(而不是动态代理)扩展,并且可能会保留它们的属性和方法。但请记住,这是错误的。