2016-06-16 38 views
0

我在JPA中使用EntityListener時遇到問題。當孩子被孤兒移除時EntityListener不工作

該項目是基於:

JPA 2.1。

的EclipseLink 2.6.3

的MySQL 5.7.11

有一個實體的作者和圖書,作者有書和oprhanRemoval = true的一對多關係。

如果我得到數據庫的作者,我刪除對書籍的引用並保留作者。這本書被刪除,但聽衆沒有運行

代碼是自我解釋

@Entity 
@Table(name = "ges_autor") 
public class Author implements Serializable, ItemIf { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private long id; 

    @OneToMany(mappedBy = "author",cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, orphanRemoval = true) 
    //@PrivateOwned I have tried it without result 
    protected List<Book> books; 

//getters y setters 
} 

@Entity 
@Table(name = "ges_book") 
@EntityListeners({BookListener.class}) 
public class Book implements Serializable, ItemIf { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private long id; 

    @ManyToOne 
    @JoinColumn(name="autor_id") 
    protected Author author; 

//getters y setters 
} 



public class BookListener { 
    @PrePersist 
    private prePersist(Book libro){ 
     System.out.println("Listener libro persist ejecutado"); 
    } 
    @PreUpdate 
    private preUpdate(Book libro){ 
     System.out.println("Listener libro update ejecutado"); 
    } 
    @PreRemove 
    private preRemove(Book libro){ 
     System.out.println("Listener libro remove ejecutado"); 
    } 
} 

要重現錯誤:

Author autor = getFacade().find(id); 
autor.getLibros().remove(libro); 
getEntityManager().merge(autor); 

的orphanRemoval工作和書籍被刪除,但在刪除前聽衆無法正常工作

回答

0

問題的原因是EclipseLink實施中的一個錯誤。如指定的here preremove方法應該在orphanRemoval之後執行,但事實是它沒有運行。唯一參考這個bug發現它在eclipse forum

我還沒有找到一個官方的錯誤既沒有解決方案或解決方法。我決定把所有的東西都遷移到Hibernate,但至少我在這裏發佈了根本原因,以防它幫助某人。

對不起可能的語法錯誤或拼寫錯誤。