我尝试执行此代码
@Transactional
@Controller
public class MyController{
....
@RequestMapping(..)
public String MyMethod(...)
{
....
try {
ao_history_repository.save(new AoHistory(..));
}
catch (DataIntegrityViolationException e) {
System.out.println("history already exist");
}
....
model.addAttribute("...", my_respository.findAoToDetail(id) );
return "...";
}
但是当我得到重复的条目Exception时,我会抓住它,但是在我得到另一个例外
之后org.hibernate.AssertionFailure: null id in persistence.AoHistory entry
(don't flush the Session after an exception occurs)
我知道当抛出ConstraintViolationException时它会使当前会话无效但是如何重新打开新会话和新事务?
答案 0 :(得分:1)
在你写作时,你需要一个新的交易。从您的代码片段看,最简单的事情是将@Transactional
从控制器移动到存储库类。作为替代方案,您可以添加服务图层并在那里移动@Transactional
。
另一种方法是在尝试将实体对象保存在实体管理器中之前预先检查实体对象,以便永远不会抛出异常。