如何解决处理持久性异常
| 我在捕获异常时遇到了一个小问题。我有这样的代码: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块之外,对吗?有什么建议我该怎么办?
解决方法
对于您的用户实体,我认为您与角色的关系可以/应该是ManyToMany。
如果也将CascadeType.PERSIST放在该关系上,则无需像在catch块中那样手动管理持久化对象图。
, 如果em.persist()抛出Exception。然后,在catch语句中再次(两次)调用该方法似乎很奇怪。
您需要在catch语句内添加另一个try catch,以处理第二个异常。
或者,您需要更改逻辑以检查是否需要先保留角色,而不是通过异常捕获来处理它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。