2017-02-16 59 views
0

我使用Spring Boot,運行於v1.5.1.RELEASE,Spring v4.3.6.RELEASE。我試圖對我的JPA事件監聽器有點聰明,但它不工作;JPA EventListeners不工作

我的實體看起來像這樣

@Entity 
@EntityListeners({MyEntityListener.class}) 
public class Entity extends SomeOtherEntity implements SomeInterfaceForAudit { 
} 

我EventListener的類看起來像這樣

public class MyEntityListener extends EntityListener<SchoolAdmin> { 

// some other useful things in here... 

} 

我的「聰明」是,我曾經試圖「泛型化」的EntityListener這樣;

公共抽象類EntityListener {

public abstract class EntityListener<T> { 

     private Logger logger = LoggerFactory.getLogger(this.getClass()); 

     @PostUpdate 
     @PostConstruct 
     @PostRemove 
     public void queueForIndex(T entity) { 
      logger.info("queueForIndex " + entity.toString()); 
     } 
    } 
} 

沒有做記錄。我試圖在我的Entity類中創建一個像這樣的方法

@PostUpdate 
public void reIndex() { 
    System.out.println("--- post update-- ---- -<<<--- " + entity); 
} 

This works。我看不出爲什麼我的Generified versjon不應該工作?任何人?

回答

1

如果你看官方文檔,對於jpa實體生命週期回調註釋,你會看到那裏沒有@Inherited註釋。這個元註釋使註釋從超類繼承。由於它不在這些回調方法註釋中,因此子類將不知道它們在超類中的存在。在你的情況下,MyEntityListener.class正在通過繼承作爲普通方法獲取queueForIndex(T實體)方法,而不是實體生命週期回調方法。

僅顯示一個如實施例參考: http://docs.oracle.com/javaee/6/api/javax/persistence/PostUpdate.html

@Target(value=METHOD) 
@Retention(value=RUNTIME) 
public @interface PostUpdate