2010-08-17 34 views
19

Khi một ràng buộc duy nhất bị vi phạm, một số javax.persistence.RollbackException bị ném. Nhưng có thể có nhiều lý do để ném một số RollbackException. Làm cách nào tôi có thể tìm ra ràng buộc duy nhất đã bị vi phạm?Làm cách nào để xử lý các vi phạm ràng buộc duy nhất của JPA?

try { 
    repository.save(article); 
} 
catch(javax.persistence.RollbackException e) { 
    // how to find out the reason for the rollback exception? 
} 

Trả lời

17

Làm cách nào để tìm ra ràng buộc duy nhất đã bị vi phạm?

ngoại lệ đang bị xiềng xích, bạn phải gọi getCause() đệ quy để có được ngoại lệ cụ thể nhà cung cấp (và có thể đi xuống SQLException) để chuyển nó thành một cái gì đó ứng dụng của bạn có thể xử lý độc đáo cho người dùng của bạn. Sau đây sẽ in ra chuỗi các ngoại lệ:

for (t = e.getCause(); t != null; t = t.getCause()) { 
    logger.debug("Exception:" + t); 
} 

Đối với việc xử lý ngoại lệ và "dịch", bạn có thể làm một cái gì đó giống như những gì mùa xuân không (xem JpaDialect lớp khác nhau, ví dụ HibernateJpaDialect để có được một ý tưởng).

Tất cả điều này là không tốt đẹp, mã này sẽ không thể di chuyển và tìm kiếm những gì thuộc tính (s) gây ra vi phạm sẽ không hề dễ dàng. Điều này bằng cách nào đó xác nhận rằng không có elegant and portable way to handle constraint violations in JPA.

3

Sử dụng e.getCause() để kiểm tra điều gì đã gây ra sự quay lại.

+0

... và sau đó phân tích cú pháp 'getCause(). GetMessag()'? – deamon

+0

Điều đó tùy thuộc vào ngoại lệ bạn sẽ nhận được. Nếu đó là một 'SQLException,' kiểm tra lỗi và SQLStatus. Tuy nhiên, một số khung công tác như Spring chuyển những thứ này thành một cái gì đó có ý nghĩa hơn ('DataIntegrityViolationException'). –

0

tôi nghĩ rằng in dấu vết ngăn xếp sẽ giúp bạn biết điều này. e.printStackTrace();

+0

Tôi không có kế hoạch xử lý ngoại lệ theo cách thủ công :-) – deamon

0

Bạn có thể làm như thế này:

StringWriter writer=new StringWriter(); //remains the message from stack trace. 
e.printStackTrace(new PrintWriter(writer)); 
String message=writer.toString(); // gets the message of full stack trace. 

Và sau đó xem các thông tin về ngoại lệ.

+0

Ok, nhưng tôi nên làm gì với StackTrace? Phân tích cú pháp một chuỗi với dấu vết ngăn xếp hơi xấu xí, nhưng có lẽ là khả năng duy nhất. – deamon

+1

Và làm cách nào tôi biết trường nào gây ra vi phạm ràng buộc? – deamon

1

trình biên dịch trả về ngoại lệ SQLIntegrityConstraintViolationException, trong khi cố gắng vi phạm ràng buộc duy nhất.

Sử dụng khái niệm khối catch sau để xử lý các ngoại lệ thích hợp.

catch(SQLIntegrityConstraintViolationException e) 
{ 
    // Error message for integrity constraint violation 
} 
catch(Exception e) 
{ 
// Other error messages 
} 
Các vấn đề liên quan