2011-10-29 32 views
5

Ludzie!Czy @EntityListener działa również z klasą @MappedSuperclass?

Jeśli zdefiniuję klasę jednostek i dopiszę ją przy pomocy @MappedSuperclass i @EntityListener, czy słuchacz zostanie również wywołany dla zdarzeń cyklu życia w klasie potomnej?

przykład:

@MappedSuperclass 
@EntityListeners(class=LastUpdateListener.class) 
public abstract class Animal { 
    @Id private Integer id; 
    private String name; 
    private Calendar dateOfBirth; 
    @Transient private int age; 
    private Date lastUpdate; 
    //getters and setters 

    /** 
    * Set my transient property at load time based on a calculation, 
    * note that a native Hibernate formula mapping is better for this purpose. 
    */ 
    @PostLoad 
    public void calculateAge() { 
     Calendar birth = new GregorianCalendar(); 
     birth.setTime(dateOfBirth); 
     Calendar now = new GregorianCalendar(); 
     now.setTime(new Date()); 
     int adjust = 0; 
     if (now.get(Calendar.DAY_OF_YEAR) - birth.get(Calendar.DAY_OF_YEAR) < 0) { 
      adjust = -1; 
     } 
     age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR) + adjust; 
    } 
} 

public class LastUpdateListener { 
    /** 
    * automatic property set before any database persistence 
    */ 
    @PreUpdate 
    @PrePersist 
    public void setLastUpdate(Cat o) { 
     o.setLastUpdate(new Date()); 
    } 
} 

Dzięki.

Odpowiedz

3

Tak, metoda wywoływana za pomocą @PostLoad w odwzorowanej superklasie i metody detektora encji LastUpdateListener zostają wywołane.

Coś takiego jak wydarzenie cyklu życia dla zmapowanych superklasy nie istnieje. Jak zwykle dotyczy podklasy.

+1

Muszę powiedzieć w tej chwili nie jest to możliwe w Eclipse TopLink powodu tego [Bug] [1] [1]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=302194 "pluskwa" – rekiem87