Java Spring JPA保存瞬态实体

Java Spring JPA保存瞬态实体,java,mysql,spring,hibernate,Java,Mysql,Spring,Hibernate,在hibernate中,如果Ipersistnew entity,它应该成为托管实体,而且它应该返回托管实体 如果实体已分离,则合并将返回托管实体,但我传递的实体仍将分离 我用hibernate在spring boot中尝试过,除了以下情况外,其他一切都正常工作: User transientUser=new User(); transientUser.setId(9L); User managedTransientUser=userRepository.save(transie

在hibernate中,如果I
persist
new entity,它应该成为托管实体,而且它应该返回托管实体

如果实体已分离,则合并将返回托管实体,但我传递的实体仍将分离

我用hibernate在spring boot中尝试过,除了以下情况外,其他一切都正常工作:

User transientUser=new User();
    transientUser.setId(9L);
    User managedTransientUser=userRepository.save(transientUser);

如果我手动设置Id(即使删除自动生成),我传递的实体(transientUser)仍将处于非托管状态。如果我使用generation Identity,那么返回的实体和传递的实体是相同的(id为null,DB将自动递增),这是预期的吗?

这只是因为您没有调用
persist()
。您正在调用
userRepository.save()


此方法测试实体是否为新实体(通过检查实体是否已具有ID)。如果是,则调用
persist()
。否则它将调用
merge()
。因为您的实体已经有了一个ID,它调用了
merge()

,所以您的意思是它只检查ID吗?它不检查数据库中是否有值?不,Spring数据jpa没有。不过,JPA在调用merge()时会这样做。通常应避免使用未生成的ID。如果您确实使用了未生成的ID,那么当您想要persist()而不是save()时,我将显式调用persist()。