Spring @Transactional在Hibernate

时间:2015-07-30 14:17:46

标签: 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());
        return ok("Updated successfully.");
    } catch (Exception e){
        return badRequest("Error updating");
    }
}

updateFromJsonString方法位于另一个项目中,它使用hibernate更改sql表。问题在于此更新'当@Transactional注释丢失时方法工作正常,但是当它在那里时,我得到以下异常:

[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

知道问题是什么,为什么@Transactional会出错?

1 个答案:

答案 0 :(得分:1)

那是因为你加载了一个实体,所以它由Hibernate管理。因此,会话打开时发生的任何更改都会被dirty checking mechanism拦截并在{{{}}传播到数据库。 3}} Hibernate Session

我怀疑你将一个新的孩子添加到已经包含该子实体的一对多集合中。