【发布时间】:2020-01-07 08:45:12
【问题描述】:
我们有 EntityManager persist() 和 @Transactional。如果插入的数据超过列长度,persist 不会抛出 DataIntegrityViolationException。当带有@Transactional 的2-level up 父方法返回时抛出。
class Worker {
@Transactional
public Integer createEmployee(String name) {
// employeeId is generated after checking if employee exists or not
saveEmployee(name, employeeId);
send_to_third_party(employeeId);
return employeeId;
}
saveEmployee(String name, Integer employeeId){
Employee em = new Employee();
// Get other data for employee like department etc.
dao.persist(employee);
}
}
class Dao {
@autowired
EntityManager em;
@Transational
public void persist(Object object) {
try{
em.persist(object);
log("successful");
}
catch(RuntimeException ex) {
log("persist failed");
throw ex;
}
}
}
如代码所示,saveEmployee即使出现数据长度大于列长度的错误也会返回成功。将employeeId 发送给第三方并进行处理。当 createEmployee 返回employeeId 时,它会抛出异常“DataIntegrityViolationException”并显示消息“字符串或二进制数据将被截断”。最后,员工没有保存在我们的数据库中,而是由第三方处理,这会在系统中造成不匹配和进一步的错误。
dao.persist() 中的@Transactional 不会提交persist 操作吗?为什么抛出异常需要这么长时间?
感谢您的帮助。
附: - 我们肯定会检查数据长度。
【问题讨论】:
标签: java sql hibernate spring-boot