【发布时间】:2015-09-07 20:39:34
【问题描述】:
我需要在 glassfish3.0 上使用 JPA 2.0 和 EJB3.0 删除忽略任何完整性约束的员工列表(即成功删除尚未与任何其他人相关的实体或跳过与其他人相关的实体) :
我在列表中迭代并在 try/catch 中的 require_new 事务中调用实体管理器,我希望这将在大事务中打开小型嵌套事务,并且我使用 em.flush() 来强制更新。
但在它抛出的相关实体的迭代中;
异常 [EclipseLink-4002](Eclipse 持久性服务 - 2.4.2.v20130514-5956486):org.eclipse.persistence.exceptions.DatabaseException 内部 例外: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 无法删除或更新父行:外键约束失败
并继续下一位员工,但在提交大事务时,它会回滚并抛出相同的异常!
我希望在 new-small 事务中抛出/捕获异常,并提交列表其余部分成功删除的实体...
我有什么想念的吗?
编辑:
这里是一些代码,Facade中调用实体管理器移除bean的代码,我用required-new对函数进行了注解:
public void deleteEmployeeData(Set<Employees> deleted) throws DatabaseException {
Iterator itr;
Employees emp;
//delete unused recordes
try {
itr = deleted.iterator();
while (itr.hasNext()) {
emp = (Employees) itr.next();
deleteEmployee(emp);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("DONE");
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void deleteEmployee(Employees emp){
try {
this.remove(emp);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
【问题讨论】:
-
我们需要更多地了解您的模型,是否某些实体与您要删除的实体有关系?您是否在同一事务中删除了该关系?
-
有另一个实体引用我要删除的员工实体,因为违反了完整性约束,我需要保留从另一个实体引用的所有员工并删除其他员工
-
@Ajan 我用一些代码编辑了这个问题
-
好的,这很重要,应该在问题中得到精确说明:你不想引入约束,但是当约束异常发生时你忽略删除(这不是真正的好方法,但是 . .无论如何)
-
你为什么用
@TransactionAttribute而不是@Transactional?
标签: java jpa glassfish ejb-3.0