我正在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