我正在Glassfish v3应用服务器上使用EJB和JPA。我有一个实体类,我迫使其中一个字段与@Column注释是唯一的。在EJB/JPA环境中优雅处理约束违规?
@Entity
public class MyEntity implements Serializable {
private String uniqueName;
public MyEntity() {
}
@Column(unique = true, nullable = false)
public String getUniqueName() {
return uniqueName;
}
public void setUniqueName(String uniqueName) {
this.uniqueName = uniqueName;
}
}
当我尝试坚持与此字段设置为一个非唯一值我得到一个异常的对象(如预期)时由EJB容器管理的事务提交。
我有两个问题,我想解答:
1)我得到的例外是无益的“javax.ejb.EJBException异常:事务终止”。如果我递归地调用getCause()足够多次,我最终会达到更有用的“java.sql.SQLIntegrityConstraintViolationException”,但是这个异常是EclipseLink实现的一部分,我不太喜欢依赖它的存在。
有更好的方法来获得JPA的详细错误信息吗?
2)EJB容器坚持记录这个错误,即使我抓住并处理它。
有没有更好的方法来处理这个错误,这将阻止Glassfish使用无用的异常信息弄乱我的日志?
谢谢。
@hallidave当心了'PersistenceException'会作废事务上下文和回滚事务,如果赶上与否*没有关系*。 javadoc说:“除了NoResultException,NonUniqueResultException,LockTimeoutException和QueryTimeoutException的实例外,所有PersistenceException实例都将导致当前事务(如果有的话)被标记为回滚。”这与普通的JDBC有很大的区别,你可以吞下一个异常(取决于你所做的)并仍然提交。 – ewernli 2010-03-26 11:32:41
@ewernli是的,我知道无论怎样,事务都会回滚 - 这实际上就是我发现烦人的堆栈记录。理想情况下,我想在EJB的上下文中捕获异常,但在容器提交事务之前不会发生。我正在考虑自己管理交易,所以我有更多的控制权。 – hallidave 2010-03-26 15:00:49
如果EclipseLink抛出一个'PersistenceException',为什么它会更好?你没有机会弄清楚到底发生了什么(哪个字段违反了一个独特的约束条件(你可能在一个实体中有更多独特的字段)) – pihentagy 2010-07-26 16:03:01