Java 未调用JPA@Pre和@Post回调

Java 未调用JPA@Pre和@Post回调,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,我在Hibernate上使用SpringBoot2和JPA 我必须使一些实体具有特殊的审计功能。我可以简单地使用entity类中的@PrePersist/@pospersist回调来实现它 我想把这个回调放在基类中。但是,如果这个基类是一个没有@Entity注释的简单java类,则不会调用回调。 如果我将@Entity注释也放在基类上,那么我会得到一个错误表'my_base_class_Entity'不存在 这是有效的: @Entity @Table(name = "document") pub

我在Hibernate上使用SpringBoot2和JPA

我必须使一些实体具有特殊的审计功能。我可以简单地使用entity类中的
@PrePersist
/
@pospersist
回调来实现它

我想把这个回调放在基类中。但是,如果这个基类是一个没有
@Entity
注释的简单java类,则不会调用回调。 如果我将
@Entity
注释也放在基类上,那么我会得到一个错误
表'my_base_class_Entity'不存在

这是有效的:

@Entity
@Table(name = "document")
public class JpaDocument {

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

    ...

    @PrePersist
    public void prePersist(){
        logger.debug("PrePersist started");
    }

}
这不会(不调用回调函数)


可能我应该在我的
特殊性
类中添加
@Entity
注释,但它迫使我添加主键,我不希望添加主键,因为它在子实体中并不总是相同的。除此之外,
特殊性
没有数据库关系,它不是一个真正的实体。

解决方案非常简单。感谢@JB_\Nizet的评论。 将
@Entity
注释添加到基类中,而不是
@MappedSuperclass
注释,因此它工作正常

@MappedSuperclass
public class SpecialEntity {
    @PrePersist
    public void prePersist(){
        logger.debug("PrePersist started");
    }
}


@Entity
@Table(name = "document")
public class JpaDocument extends SpecialEntity {

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

    ...

}

解决办法很简单。感谢@JB_\Nizet的评论。 将
@Entity
注释添加到基类中,而不是
@MappedSuperclass
注释,因此它工作正常

@MappedSuperclass
public class SpecialEntity {
    @PrePersist
    public void prePersist(){
        logger.debug("PrePersist started");
    }
}


@Entity
@Table(name = "document")
public class JpaDocument extends SpecialEntity {

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

    ...

}

哦,就是这样。它可以与
@MappedSuperclass
配合使用。非常感谢@你能把这个作为答案吗?哦,就是这样。它可以与
@MappedSuperclass
配合使用。非常感谢@你能把这个作为答案吗?