Tôi đang làm việc với EJB và JPA trên máy chủ ứng dụng Glassfish v3. Tôi có một lớp Entity, nơi tôi buộc một trong các trường là duy nhất với chú thích @Column.Xử lý các vi phạm ràng buộc một cách tao nhã trong môi trường 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;
}
}
Khi tôi cố gắng duy trì một đối tượng với trường này được đặt thành giá trị không duy nhất, tôi nhận được ngoại lệ (như mong đợi) khi giao dịch do vùng chứa EJB quản lý.
Tôi có hai vấn đề tôi muốn giải quyết:
1) Trường hợp ngoại lệ tôi nhận được là vô ích "javax.ejb.EJBException: Giao dịch bị hủy bỏ". Nếu tôi đệ quy gọi getCause() đủ lần, cuối cùng tôi đã đạt được "java.sql.SQLIntegrityConstraintViolationException" hữu ích hơn, nhưng ngoại lệ này là một phần của việc thực hiện EclipseLink và tôi không thực sự thoải mái dựa vào sự tồn tại của nó.
Có cách nào tốt hơn để nhận thông tin lỗi chi tiết với JPA không?
2) Thùng chứa EJB khăng khăng ghi nhật ký lỗi này mặc dù tôi nắm bắt và xử lý lỗi này.
Có cách nào tốt hơn để xử lý lỗi này, điều này sẽ ngăn Glassfish không làm lộn xộn nhật ký của tôi với thông tin ngoại lệ vô dụng không?
Cảm ơn.
@hallidave Ghi chú rằng một 'PersistenceException' sẽ làm mất hiệu lực bối cảnh giao dịch và rollback giao dịch, * không quan trọng nếu bạn nắm bắt nó hay không *. Các javadoc nói "Tất cả các trường hợp của PersistenceException ngoại trừ trường hợp của NoResultException, NonUniqueResultException, LockTimeoutException, và QueryTimeoutException sẽ gây ra các giao dịch hiện tại, nếu một trong những hoạt động, để được đánh dấu cho rollback.". Đó là một sự khác biệt lớn với JDBC đơn giản là bạn có thể nuốt một ngoại lệ (tùy thuộc vào những gì bạn làm) và vẫn cam kết. – ewernli
@ewernli Vâng, tôi hiểu rằng giao dịch được khôi phục bất kể điều gì - nó thực sự chỉ là nhật ký đầy đủ các stacktraces mà tôi thấy khó chịu. Lý tưởng nhất, tôi muốn nắm bắt ngoại lệ bên trong bối cảnh của EJB, nhưng nó không xảy ra cho đến khi container bắt đầu giao dịch. Tôi đang nghĩ đến việc tự quản lý giao dịch để tôi có quyền kiểm soát nhiều hơn. – hallidave
Tại sao nó sẽ tốt hơn, nếu EclipseLink ném một 'PersistenceException'? Bạn không có cơ hội để tìm ra những gì địa ngục xảy ra (lĩnh vực nào vi phạm một ràng buộc duy nhất (bạn có thể có nhiều lĩnh vực duy nhất trong một thực thể)) – pihentagy