java - 处理持久性异常

标签 java sql database exception jakarta-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 block 之外,对吗?有什么建议我可以做些什么吗?

最佳答案

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

如果放置 CascadeType.PERSIST,则无需像在 catch block 中那样手动管理持久化对象图。关于这种关系也是如此。

关于java - 处理持久性异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6358246/

相关文章:

java - 在两个限制之间反弹值的最佳方法是什么?

java - 预验证 Azkaban 流程的流程

python - 更新数据库中的多行并记录它的最有效方法是什么?

database - BlackBerry 设备存储上的 SqLite 数据库

sql-server - 在 varchar(50) 列与 varchar(2000) 列中插入值时的性能差异?

java - 按负索引存储值

SQL数据库,多表共享主索引

mysql - 如何修复存储函数/触发器中的 "Can' t 更新表 testtab

mysql - MySQL 的求和查询,其中字段包含某些值

java - libgdx 生成后的临时 Sprite 移动