2011-09-22 35 views
6

Mã dưới đây là những gì Spring Roo tạo theo mặc định, EntityManager được đưa vào mô hình miền của bạn POJO với phần còn lại của các phương pháp để quản lý thực thể (lưu, cập nhật, xóa, tìmXXX, ...).Spring Roo: sử dụng thực thể JPA dưới dạng DAO

Có lẽ đó là một cách tiếp cận hướng đối tượng hơn (trái ngược với anemic domain model), nhưng những gì tôi không hiểu là:

  • hiệu suất vấn đề khi EntityManager được tiêm trong mỗi thực thể (hãy tưởng tượng bạn truy xuất 1000 thực thể từ cơ sở dữ liệu)

  • Không nên quản lý giao dịch (@Transactional annotations) đi vào một lớp dịch vụ? (hãy tưởng tượng bạn muốn hoạt động với hai thực thể khác nhau theo cách nguyên tử).

  • Bạn có thể nghĩ về các ưu điểm/khuyết điểm khác của mã này so với lớp DAO cổ điển không?

Mã này trông như thế này (một số phương pháp được loại bỏ cho rõ ràng):

@Configurable 
@Entity 
@RooJavaBean 
@RooToString 
@RooEntity 
public class Answer { 

    @PersistenceContext 
    transient EntityManager entityManager; 

    @Transactional 
    public void persist() { 
     if (this.entityManager == null) this.entityManager = entityManager(); 
     this.entityManager.persist(this); 
    } 

    @Transactional 
    public void remove() { 
     if (this.entityManager == null) this.entityManager = entityManager(); 
     if (this.entityManager.contains(this)) { 
      this.entityManager.remove(this); 
     } else { 
      Answer attached = Answer.findAnswer(this.id); 
      this.entityManager.remove(attached); 
     } 
    } 

    @Transactional 
    public Answer merge() { 
     if (this.entityManager == null) this.entityManager = entityManager(); 
     Answer merged = this.entityManager.merge(this); 
     this.entityManager.flush(); 
     return merged; 
    } 

    public static final EntityManager entityManager() { 
     EntityManager em = new Answer().entityManager; 
     if (em == null) throw new IllegalStateException("Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)"); 
     return em; 
    } 

    public static long countAnswers() { 
     return entityManager().createQuery("SELECT COUNT(o) FROM Answer o", Long.class).getSingleResult(); 
    } 

    public static List<Answer> findAllAnswers() { 
     return entityManager().createQuery("SELECT o FROM Answer o", Answer.class).getResultList(); 
    } 

    ... 
} 

Trả lời

3
  1. Bạn sẽ tìm thấy nhiều hơn về vấn đề này tại liên kết ở điểm thứ ba.

  2. Bạn không nhận được một lớp Dịch vụ trong ứng dụng Roo điển hình. Các phương thức dịch vụ của bạn được chứa trong thực thể, do đó có thể sử dụng @Transactional trong thực thể của bạn để đảm bảo phương thức cụ thể liên quan đến một giao dịch. Tuy nhiên, bạn sẽ có thể nhận được một lớp dịch vụ riêng biệt với phiên bản 1.2 Spring Roo mới nhất, điều này sẽ làm cho nó có thể.

  3. ADM so với DDD: Câu hỏi riêng về SO sẽ giúp ích cho vấn đề này. Dù sao, bạn có thể đạt được nhiều thông tin chi tiết về chủ đề này trên diễn đàn SpringSource Roo. http://forum.springsource.org/showthread.php?77322-Spring-Roo-with-a-services-DAO-architecture

Chúc mừng và mọi điều tuyệt vời nhất với Roo! :)

+1

Cảm ơn bạn đã liên kết tuyệt vời. Câu hỏi duy nhất nó không thực sự trả lời là câu hỏi đầu tiên. Không rõ ràng khi nào và cách EntityManager được tiêm vào mỗi thực thể. –

+0

@ GuidoGarcía, bạn có câu trả lời ngay bây giờ không? – eric2323223

+0

@ eric2323223 chưa –

Các vấn đề liên quan