Java Spring@Transactional在Hibernate中制造问题

Java Spring@Transactional在Hibernate中制造问题,java,spring,hibernate,orm,playframework,Java,Spring,Hibernate,Orm,Playframework,我有一个Play项目,在该项目中,我使用了以下带有spring@Transactional注释的方法: @Autowired Home home; @Transactional public Result update() { try { JsonNode jsonNode = request().body().asJson(); User user = home.updateFromJsonString(jsonNode.toString());

我有一个Play项目,在该项目中,我使用了以下带有spring@Transactional注释的方法:

@Autowired
Home home;

@Transactional
public Result update() {
    try {
        JsonNode jsonNode = request().body().asJson();
        User user = home.updateFromJsonString(jsonNode.toString());
        return ok("Updated successfully.");
    } catch (Exception e){
        return badRequest("Error updating");
    }
}
updateFromJsonString方法位于另一个项目中,它使用hibernate更改sql表。问题是,当@Transactional注释丢失时,此“update”方法可以正常工作,但当它存在时,我会遇到以下异常:

[error] o.h.e.j.s.SqlExceptionHelper - Duplicate entry '1-10' for key 'PRIMARY'
[error] play - Cannot invoke the action, eventually got an error: org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.
exception.ConstraintViolationException: could not execute statement

知道问题是什么吗?

这是因为您加载了一个实体,所以它由Hibernate管理。因此,会话打开时发生的任何更改都会被截获,并在Hibernate
会话时传播到数据库


我怀疑您向已经包含该子实体的一对多集合中添加了一个新的子实体。

您有一个约束冲突异常,这意味着您没有传递足够的数据来更新方法。或者您希望更新从hibernate会话分离的实体。在这种情况下,您必须在完全相同的会话中获取此实体并进行更新。如何在不手动刷新的情况下解决它?我需要程序保持“事务性”,以便在出现问题时不会发生更改。