处理持久性异常

时间:2011-06-15 13:16:28

标签: java sql database exception java-ee

我遇到了捕捉异常的小问题。我有这样的代码:

Role r=new Role("default");
r.setId(Role.DEFAULT_ID);
u.getRoles().add(r); // u is instance of entity which is in relation manytomany with r
try{
   em.persist(u);
}catch(Exception e){
   System.out.println(e.getClass().getName()+" - default role not found, creating...");
   em.persist(r);
   em.persist(u);
}

希望这一点很明确。如果默认角色尚不存在,则应该捕获异常,创建角色然后再给它一个镜头。但是我无法抓住任何例外。

抛出的前两个异常的错误日志是:

[org.hibernate.util.JDBCExceptionReporter] (http-127.0.0.1-8080-5) could not insert collection: [Comic.model.User.roles#5] [insert into USER_ACCOUNT_ROLE (USER_ACCOUNT_uid, roles_rid) values (?, ?)]
java.sql.SQLIntegrityConstraintViolationException: ...blabla you dont follow constraints

ERROR [org.hibernate.event.def.AbstractFlushingEventListener] (http-127.0.0.1-8080-5) Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: could not insert collection: [Comic.model.User.roles#5]

我想我无法捕捉到任何异常,因为它被抛到了我的try块之外吗?有什么建议可以对此做些什么?

2 个答案:

答案 0 :(得分:2)

对于您的用户实体,我认为您与Role的关系可以/应该是ManyToMany。

如果您在该关系中放置CascadeType.PERSIST,则不需要手动管理持久化对象图,就像在catch块中一样。

答案 1 :(得分:1)

如果em.persist()抛出和异常。然后,你会在catch语句中再次调用该方法(两次)似乎很奇怪。

你需要在catch语句中添加另一个try catch来处理第二个异常。

或者您需要更改逻辑以检查是否需要先保留角色,而不是使用Exception捕获来处理它。