2011-10-03 34 views
14

Tôi đã sử dụng EJB3/JPA khi lưu giữ các thực thể của mình và tôi hài lòng về cách quản lý công việc có liên quan đến DB của tôi liên quan đến nhiệm vụ . Mối quan tâm duy nhất của tôi là xử lý ngoại lệ. Mã mẫu của tôi khi lưu thực thể luôn xuất hiện trong hương vị này. Hầu hết các hướng dẫn mà tôi đọc trên mạng có trong hương vị này cũng không liên quan đến xử lý ngoại lệ.Xử lý ngoại lệ tốt hơn trong JPA

@Stateless 
public class StudentFacade{ 
    @PersistenceContext(unitName = "MyDBPU") 
    private EntityManager em; 

    public void save(Student student) { 
     em.persist(student); 
    } 
} 

Nhưng tôi không biết cách xử lý ngoại lệ tốt nhất trong ứng dụng EJB là gì? Điều gì sẽ là cách tốt nhất khi xử lý ngoại lệ?

Đây có phải là cách người khác đang xử lý ngoại lệ không? Một thử bắt khối trên mặt tiền phiên của bạn?

@Stateless 
public class StudentFacade{ 
    @PersistenceContext(unitName = "MyDBPU") 
    private EntityManager em; 

    public void save(Student student) { 
     try { 
      em.persist(student); 
     } catch(Exception e) { 
      //log it or do something 
     } 
    } 
} 

hoặc để phương pháp ném ngoại lệ?

public void save(Student student) throws Exception { 
    em.persist(student); 
} 

Tôi không biết liệu sự hiểu biết của tôi có đúng không vì tôi vẫn đang học EJB. Cảm ơn

+0

nếu bạn đang ném ngoại lệ, bạn không cần phải bắt nó –

Trả lời

10

Ý tưởng xử lý ngoại lệ là thực hiện một số logic tại một điểm duy nhất trong trường hợp xảy ra lỗi. Các catch sẽ được sử dụng tại thời điểm cuối cùng, nơi bạn cần phải xử lý ngoại lệ hoặc bạn cần phải chuyển đổi một ngoại lệ đối với một ngoại lệ

Giả sử ứng dụng của bạn có nhiều lớp cụ thể là hành động, dùng cho mặt tiền, Persist

Đại biểu ngoại lệ Trong trường hợp này, bất kỳ ngoại lệ nào được ném lên Mặt tiền đều có thể được ném vào lớp hành động ở trên. Trong trường hợp ngoại lệ cụ thể sẽ bị bắt và xử lý với thông báo lỗi thích hợp.

//This is in Facade Layer 
public void save(Student student) throws AppException{ 
    //exceptions delegated to action layer 

    //call to Persist Layer 
} 

Chuyển đổi ngoại lệ chung App ngoại lệ Say trong kiên trì bạn nhận được và DBException như SQLException.Ngoại lệ này không nên được gửi như vậy để hành động hoặc lớp mặt tiền, vì vậy chúng tôi bắt ngoại lệ đặc biệt và sau đó ném một ngoại lệ mới (người dùng định nghĩa ngoại lệ cho các ứng dụng)

//This is in Persist Layer 
public void save(Student student) throws AppException{ 
     //converting general exception to AppException and delegating to Facade Layer 

     try{ 
      em.persist(student);//call to DB. This is in Persist Layer 
     }catch(Exception e){ 
      throw new AppException("DB exception", e) 
     } 
    } 

Trong hành động lớp Bạn sẽ bắt ngoại trừ của bạn trong hành động và sau đó xử lý ngoại lệ có

//This is in Action layer 
    public void callSave(Student student){ 
      try{ 
       //call Facade layer 
      }catch(AppException e){ 
       //Log error and handle 
      } 
    } 
+3

Nếu kiên trì lớp là một EJB thì cách tiếp cận của bạn không hoạt động vì nhiều ngoại lệ sẽ xảy ra khi cam kết, sau khi phương thức trả về. – Lii

3

Nếu bạn muốn bạn ném ngoại lệ từ em.persistance (...), thì đừng bao quanh câu lệnh đó với khối try/catch đó (nguyên nhân sẽ bắt mọi ngoại lệ trong khối đó).

Cách bạn tiếp cận vấn đề này tùy thuộc vào ứng dụng, liệu có tồn tại một số mã cũ hay không. Trong trường hợp có mã di sản, tôi đề nghị bạn sử dụng cùng một cách tiếp cận (ngay cả trong một số trường hợp nó không phải là tốc độ tối ưu) để duy trì tính nhất quán.

Nếu không, tôi sẽ đề nghị theo quy tắc "ngoại lệ" - chúng sẽ được xử lý ngay từ đầu, nơi bạn có tất cả thông tin cần thiết để thực hiện hành động, và ném chúng để người khác có thể xử lý. (Nếu bạn vứt chúng đi, hãy chắc chắn rằng bạn sẽ ném một dạng ngoại lệ cụ thể nhất mà bạn có thể ném (không phải là Ngoại lệ chung)). Xử lý các ngoại lệ khi sử dụng JPA không khác gì khi xử lý các ngoại lệ Java nói chung.

Tôi hy vọng đây là thông tin đủ đơn giản về ngoại lệ mà không bắt đầu "cuộc trò chuyện tôn giáo".

0

Nếu sự kết hợp của bạn là ejb với JPA, sau đó tất cả các trường hợp ngoại lệ JPA là trường hợp ngoại lệ thời gian chạy.

xử lý ejb 2 loại ngoại lệ 1) Application Exception 2) Hệ thống ngoại lệ

Exceptions ứng dụng kiểm tra ngoại lệ về cơ bản chúng ta đang sử dụng xác nhận kinh doanh và các quy tắc kinh doanh.

Các ngoại lệ của hệ thống là ngoại lệ thời gian chạy, để nếu bất kỳ sự gián đoạn thời gian chạy nào xảy ra với container ejb sẽ can thiệp và chuyển đổi ngoại lệ thời gian chạy là ngoại lệ từ xa.

Đối với ví dụ: trong lớp dao

public void store(Cargo cargo) { 
    entityManager.persist(cargo); 
} 

Tất cả các trường hợp ngoại lệ JPA chỉ ngoại lệ thời gian chạy.

trong lớp dịch vụ ejb:

public TrackingId bookNewCargo(UnLocode originUnLocode, 
     UnLocode destinationUnLocode, 
     Date arrivalDeadline) { 

    Cargo cargo = new Cargo(trackingId, routeSpecification); 
    cargoRepository.store(cargo); 
    return cargo.getTrackingId(); 
} 

trong lớp ejb nếu có thời gian chạy ngoại lệ happend, EJB container sẽ can thiệp và chuyển đổi thành ngoại lệ từ xa.

Trong lớp giao diện:

để như JPA này -> ejb -> giao diện