当orphanRemoval删除子项时,EntityListener无法正常工作

时间:2016-06-16 18:19:37

标签: java mysql jpa

我在JPA中使用EntityListener时遇到问题。

该项目基于:

JPA 2.1。

EclipseLink 2.6.3

MySql 5.7.11

有一个实体作者和书,作者与Book有一个OneToMany关系,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正在运行并且book被删除但是preremove侦听器无法正常工作

1 个答案:

答案 0 :(得分:0)

问题的原因是EclipseLink实现中的错误。按照指定的here,preremove方法应该在orphanRemoval之后执行,但事实是它没有运行。对此错误的唯一引用是在eclipse forum中找到它。

我还没有发现官方错误无法解决或解决方法。我决定将所有内容迁移到Hibernate,但至少我在这里发布根本原因,以防它对某人有所帮助。

对不起可能的语法或拼写错误。