Hibernate和Spring以及动态代理的麻烦

时间:2009-12-22 11:28:56

标签: hibernate spring

我想结合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

1 个答案:

答案 0 :(得分:2)

您只是不将域对象放在spring上下文中。这是一种反模式。 Spring不需要管理域对象。

如何创建这样的对象?通过调用context.getBean()或注入它们。前一种情况很丑陋(并且需要域对象属于范围prototype,后者只是不起作用,因为所有bean的默认范围是singleton - 即你将得到相同的每次都是对象。否则,您将需要所有bean都具有范围prototype,以便拥有域对象的新实例。

将DAO与域对象分开 - 这是必须的。域对象应该只是带注释的POJO - 不需要任何接口(在一般情况下)。

在告诉您代码有什么问题以及如何正确修复代码之后,我会帮助您不正确地修复代码。但是,只有在截止日期是明天,或者这是一个巨大的遗留项目无权重新架构时才这样做。

如果您使用(在applicationContext.xml中)

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

然后您的类将由CGLIB(而不是动态代理)扩展,并且可能会保留它们的属性和方法。但请记住,这是错误的。