我在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侦听器无法正常工作
答案 0 :(得分:0)
问题的原因是EclipseLink实现中的错误。按照指定的here,preremove方法应该在orphanRemoval之后执行,但事实是它没有运行。对此错误的唯一引用是在eclipse forum中找到它。
我还没有发现官方错误无法解决或解决方法。我决定将所有内容迁移到Hibernate,但至少我在这里发布根本原因,以防它对某人有所帮助。
对不起可能的语法或拼写错误。