Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未为级联上删除的实体调用JPA preRemove侦听器_Java_Jpa_Eclipselink - Fatal编程技术网

Java 未为级联上删除的实体调用JPA preRemove侦听器

Java 未为级联上删除的实体调用JPA preRemove侦听器,java,jpa,eclipselink,Java,Jpa,Eclipselink,我使用Eclipselink作为JPA提供程序,并使用EntityListener捕获实体中的预删除事件。 我有以下层次结构: @Entity @Table(name = "MY_ENTITY") @EntityListeners(AuditListener.class) public class MyEntity { ..... @OneToMany(mappedBy = "myEntity", cascade = CascadeType.ALL

我使用Eclipselink作为JPA提供程序,并使用EntityListener捕获实体中的预删除事件。 我有以下层次结构:

    @Entity
    @Table(name = "MY_ENTITY")
    @EntityListeners(AuditListener.class)
    public class MyEntity {
    .....
    @OneToMany(mappedBy = "myEntity", cascade = CascadeType.ALL, orphanRemoval = true)
        private Set<AnotherEntity> anotherEntities;
    .....
    }

@Entity
@EntityListeners(AuditListener.class)
@Table(name="ANOTHER_ENTITY")
public class AnotherEntity {

    @MapsId("idMyEntity")
    @ManyToOne
    @JoinColumn(name = "ID_MY_ENTITY")
    private MyEntity myEntity;
}
@实体
@表(name=“我的实体”)
@EntityListener(AuditListener.class)
公共类MyEntity{
.....
@OneToMany(mappedBy=“myEntity”,cascade=CascadeType.ALL,orphanRemoving=true)
私设实体;
.....
}
@实体
@EntityListener(AuditListener.class)
@表(name=“其他实体”)
公共类实体{
@MapsId(“idMyEntity”)
@许多酮
@JoinColumn(name=“ID\u MY\u实体”)
私人MyEntity MyEntity;
}
问题是,当我从另一个实体集中删除一个条目并从JPA中调用update for myEntity时,会为实体“myEntity”调用方法public void preUpdate(DescriptorRevent事件),这是正确的,但当它级联到“AnotherEntity”实体并被删除(正如它应该的那样)时,不会调用preRemove(DescriptorRevent事件)方法,我需要知道何时发生这种情况

这里缺少任何注释吗?我是否需要直接调用remove for'AnotherEntity'以使回调正常工作?
提前谢谢

听起来你是在依赖孤儿移除来触发预移除,我真的不知道JPA是否能保证这一点(我认为应该)。您有没有理由不直接调用
remove(另一个实体)
?如果以后不需要使用持久性上下文,则不需要维护双向关系。即使在使用持久性上下文的情况下,我也更喜欢显式地调用remove(并将其从集合中移除),以便下一个开发人员知道发生了什么。孤儿删除是一个有用的特性,但是它对JPA来说是一个额外的负担,我认为删除孩子是使用JPA的优势之一,所以它会抽象数据库本身。除了另一个实体,我在这个对象中有更多的实体,手动删除每个子对象将非常复杂。将来如果有人在这个层次结构中添加另一个实体,这个人必须记住手动调用“删除”。我倾向于同意删除是明智的,但我永远不会使用它。使用它时,持久性上下文是不一致的。如果使用
em.remove()
删除实体,则持久性上下文会知道,并且对
em.find(PK)
的调用将返回null,如果从集合中删除实体,则不会出现这种情况,因为只有提交事务后才会进行删除(除非您进行了级联删除并且删除了父级)。此外,我可以确认,在EclipseLink 2.6.4中删除实体或删除实体时,不会调用@PreRemove。