2014-10-18 56 views
2

在我正在处理的Spring/Hibernate项目上,我注意到要在数据库中保留一个新对象,使用了一个自动布线的实体。简化的,它是做这样的事情: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时,你不应该创建对象。

我已经谷歌搜索看到这是什么政策,但我找不到任何东西。有吨的Spring/Hibernate教程,但我没有看到Hibernate实体在那些自动装配。但是,它们可以简化,因为它们只是教程。

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

(为了强调:我不是在寻找所使用的方法的副作用的解决方案我问,如果它的原理是在视图Spring和Hibernate的正确。)

回答

2

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

+0

谢谢你,你的回答对我有意义。如果你碰巧知道任何文件来支持它,并且可以添加那些更值得赞赏的文件。我真的希望得到更多的回应这个问题和更多的投票你的评论作为一个确认,但无论如何这是一个令人满意的答案在我心中。 – 2014-10-25 21:22:02

+1

没有文件。这只是经验。 – 2014-10-25 22:09:30

+0

我试图成为'正确的'。就我个人而言,我只需要你的45.2k声望单词。 ;) – 2014-10-25 22:13:46

相关问题