2010-03-02 28 views
6

Hy guys,Tuyên bố người nghe sự kiện Hibernate trong môi trường JPA

Tôi đang làm việc trên một dự án được phát triển trong môi trường Java EE 5. Tôi muốn biết làm thế nào tôi có thể tuyên bố một sự kiện nghe Hibernate để tôi có thể được thông báo khi hoạt động CRUD được thực hiện.

Tôi đã đọc mà tôi phải khai báo trong file cấu hình Hibernate *cfg.xml một cái gì đó như thế này:

<hibernate-configuration> 
    <session-factory> 
     ... 
     <event type="load"> 
      <listener class="com.eg.MyLoadListener"/> 
      <listener class="org.hibernate.event.def.DefaultLoadEventListener"/> 
     </event> 
    </session-factory> 
</hibernate-configuration> 

Vấn đề là tôi không có một tập tin trong dự án. Chúng tôi đang sử dụng JPA (với Hibernate như là thực hiện cơ bản). Bạn có biết tôi có cần tạo một tệp cụ thể không? Nếu có, tôi nên đặt nó ở đâu?

Xin cảm ơn trước.

+1

Xin chào, bạn có câu trả lời không? – Scarlett

Trả lời

4

Lưu ý rằng bạn cũng có thể chỉ định điều này với chú thích trên phương thức gọi lại. Hoặc nhúng chúng vào chính đối tượng đó hoặc trong một lớp riêng biệt, được gọi là trình lắng nghe thực thể. Dưới đây là một đoạn trích từ documentation:

@Entity 
@EntityListeners(class=Audit.class) 
public class Cat { 

    @Id private Integer id; 
    private String name; 

    @PostLoad 
    public void calculateAge() { 
     ... 
    } 
} 

public class LastUpdateListener { 

    @PreUpdate 
    @PrePersist 
    public void setLastUpdate(Cat o) { 
     ... 
    } 
} 

Tôi đoán bạn cũng có thể chỉ định trong cấu hình XML. Nhưng chú thích thuận tiện hơn trong quan điểm của tôi.

+0

Cảm ơn, Nhưng tôi nghĩ đây là những người nghe thực thể JPA. Tôi đã thử với những cái này và tôi đang gặp phải một số vấn đề. Tôi muốn thử trực tiếp với người nghe sự kiện Hibernate. – user284400

5

Tôi cho rằng bạn đang sử dụng chú thích? Nếu vậy, bạn có thể sử dụng @EntityListeners chú thích để làm điều đó, như vậy:

@MappedSuperclass 
@EntityListeners(AbstractEntityListener.class) 
public abstract class AbstractEntity { 
    ... 
} 

lớp người nghe thực thể của bạn có thể trông như thế này:

public class AbstractEntityListener { 

    /** 
    * Set creation and lastUpdated date of the entity. 
    * 
    * @param entity {@link AbstractEntity} 
    */ 
    @PrePersist 
    @PreUpdate 
    public void setDate(final AbstractEntity entity) { 
     final Date now = new Date(); 
     entity.setModified(now); 
    } 

} 

Có chú thích khác nhau có sẵn để đón các sự kiện khác nhau, như @PrePersist, @PreUpdate, @PostLoad, v.v.

+0

Không, câu hỏi thực sự là về nơi đặt cấu hình cụ thể hibernate khi sử dụng JPA. – ewernli

+1

@ewernli: "Tôi muốn biết làm cách nào tôi có thể khai báo trình xử lý sự kiện Hibernate để tôi có thể được thông báo khi hoạt động CRUD được thực hiện". Câu trả lời của tôi giải quyết vấn đề mà không có bất kỳ pha nguy hiểm Hibernate rườm rà, tôi nghĩ. – Henning

+0

Tôi đã hủy xóa câu trả lời cũ của tôi để bạn có thể xem câu trả lời từ OP. Vì lý do nào đó, anh không muốn sử dụng người nghe thực thể. Tôi chia sẻ ý kiến ​​của bạn nếu không. – ewernli

2

Có vẻ như bạn có thể chỉ định hibnerate.cfg.xml thông thường làm tài sản hibernate.ejb.cfgfile.

Bạn cũng có thể xác định tất cả cấu hình hibernate của bạn trong thông thường Hibernate cách: bên trong một file hibernate.xfg.xml. Bạn phải yêu cầu thực hiện JPA để sử dụng tệp cấu hình này thông qua thuộc tính hibernate.ejb.cfgfile.

Xem this đăng hoặc this một.

<persistence> 
<persistence-unit name="manager1" transaction-type="JTA"> 
    <jta-data-source>java:/DefaultDS</jta-data-source> 
    <properties> 
     <property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml"/> 
    </properties> 
</persistence-unit> 
</persistence> 

Lưu ý rằng tôi không bao giờ sử dụng cá nhân đó.

6

Trong persistence.xml của bạn:

<persistence> 
    <persistence-unit name="myPersistenceUnit"> 
     ... 
     <snip/> 
     ... 
     <properties> 
      <property name="hibernate.ejb.event.load" value="com.eg.MyLoadListener,org.hibernate.event.def.DefaultLoadEventListener"/>  
     </properties> 
    </persistence-unit> 
</persistence> 

Trong Hibernate EntityManager docs nhìn vào "Bảng 2.1 Hibernate tính Entity quản lý cụ thể." Cho tất cả các thuộc tính hiện hành.

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