我遇到了捕捉异常的小问题。我有这样的代码:
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块之外吗?有什么建议可以对此做些什么?
答案 0 :(得分:2)
对于您的用户实体,我认为您与Role的关系可以/应该是ManyToMany。
如果您在该关系中放置CascadeType.PERSIST,则不需要手动管理持久化对象图,就像在catch块中一样。
答案 1 :(得分:1)
如果em.persist()抛出和异常。然后,你会在catch语句中再次调用该方法(两次)似乎很奇怪。
你需要在catch语句中添加另一个try catch来处理第二个异常。
或者您需要更改逻辑以检查是否需要先保留角色,而不是使用Exception捕获来处理它。