Hibernate实体应该是自动装配还是手动'实例化?

时间:2014-10-18 18:30:07

标签: java spring hibernate dependency-injection autowired

在我正在研究的S​​pring / Hibernate项目中,我注意到为了在数据库中保留一个新对象,使用了一个自动装配的实体。简化,它正在做这样的事情:

@Service
public class SomeArbitraryManager {
    @Autowired private SomeArbitraryItem item; // The Hibernate entity.
    @Autowired private SomeArbitraryDao dao; // The corresponding DAO.

    public void arbitraryMethodThatNeedsToStoreAnItem(long someId, String someValue) {
        item.setPropertyA(someId);
        item.setPropertyB(someValue);
        item.setPropertyC(new Date());
        dao.save(item);
    }
}

如上所述,这是简化的想法,在实践中有更多的属性,不同的方法进行插入和错误处理。现在,发生了一个错误,Hibernate实际上只会覆盖最后插入的行。我相信这是由于SomeArbitraryItem在Hibernate插入后接收id(用于主键),而Hibernate在保存相同项目时假设更新。在另一种情况下,插入的对象的属性并未全部更新,因此插入了SomeArbitraryItem,其中包含一些包含最后插入值的字段。

我问为什么没有为每次插入使用新的SomeArbitraryItem,如下所示:

    SomeArbitraryItem item = new SomeArbitraryItem();
    ... // Set properties.
    dao.save(item);

这对我来说是有意义的,因为如果它是一个新的(数据库)对象,它不应该是一个新的常规java对象吗?当我提出问题时给出的答案是,当使用DI时,你不应该创建对象。

我已经用Google搜索了解这方面的政策,但我无法找到任何结果。虽然有 吨的Spring / Hibernate教程,但我没有看到Hibernate实体在那些中自动装配。但是,它们可以简化,因为它们只是教程。

那么:应该怎么做? Hibernate实体应该自动装配吗?它们应该被实例化吗?或者,为了不将我们绑定到特定的类,我们应该每次从Spring应用程序上下文中获取一个新的吗?还有别的吗?

(强调:我不是在寻找所用方法的副作用的解决方案。我想问一下,鉴于Spring和Hibernate,它的原理是否正确。)

1 个答案:

答案 0 :(得分:2)

您应该只连接将为当前整个类提供特定功能的类。由Hibernate(或任何其他ORM框架)管理的实体类不满足此类要求,您应该使用new关键字创建它,否则它们将作为从数据源中查找数据而创建,因此它们不应该由Spring管理或任何其他DI框架。