在我正在研究的Spring / 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,它的原理是否正确。)
答案 0 :(得分:2)
您应该只连接将为当前整个类提供特定功能的类。由Hibernate(或任何其他ORM框架)管理的实体类不满足此类要求,您应该使用new
关键字创建它,否则它们将作为从数据源中查找数据而创建,因此它们不应该由Spring管理或任何其他DI框架。