Java 休眠实体是自动连线还是';手动';实例化?

Java 休眠实体是自动连线还是';手动';实例化?,java,spring,hibernate,dependency-injection,autowired,Java,Spring,Hibernate,Dependency Injection,Autowired,在我正在进行的Spring/Hibernate项目中,我注意到为了在数据库中持久化一个新对象,使用了一个自动连接的实体。简而言之,它是这样做的: @Service public class SomeArbitraryManager { @Autowired private SomeArbitraryItem item; // The Hibernate entity. @Autowired private SomeArbitraryDao dao; // The correspo

在我正在进行的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(主键)后接收到id,而Hibernate在保存同一项时假设进行了更新。在另一种情况下,插入对象的属性没有全部更新,因此插入了SomeArbitraryItem,其中一些字段包含上次插入的值

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

    SomeArbitraryItem item = new SomeArbitraryItem();
    ... // Set properties.
    dao.save(item);
这对我来说是有意义的,因为如果它是一个新的(数据库)对象,它不应该也是一个新的常规java对象吗?当我问起这个问题时,我得到的答案是,当使用DI时,你不应该创建对象

我在谷歌上搜索过这方面的政策,但什么也找不到。尽管有很多Spring/Hibernate教程,但我没有看到这些教程中的Hibernate实体是自动连接的。但是,它们可以简化,因为它们只是教程

那么:这应该怎么做呢?休眠实体应该自动连线吗?它们是否应该被实例化?或者,为了不把我们束缚在一个特定的类上,我们应该每次从Spring应用程序上下文中获取一个新的类吗?还有别的吗


(为了强调:我不是在寻找所用方法的副作用的解决方案。我是在问,从Spring和Hibernate的角度来看,它的原理是否正确。)

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

谢谢,您的回答对我来说很有意义。如果您碰巧知道任何支持它的文档,并可以添加这些文档,我们将不胜感激。我真的希望这个问题能得到更多的回应,并对你的评论投更多的票作为确认,但不管怎样,在我心目中这都是一个令人满意的答案。没有文件。这只是经验,我只是想表现得“适当”。就我个人而言,我只会接受你45.2k的口碑