JPA @Pre和@Post回调未调用

时间:2019-05-01 12:00:13

标签: java hibernate jpa spring-data-jpa

我在Hibernate上使用带有JPA的Spring Boot 2。

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

我想将此回调放在基类中。但是,如果此基类是不带@Entity注释的简单Java类,则不会调用回调。 如果我也将@Entity注释放在基类上,那么我将得到一个错误Table 'my_base_class_entity' doesn't exist

这有效:

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

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

    ...

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

}

这不是(未调用回调函数)

public abstract 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;

    ...

}

可能我应该将@Entity注释添加到我的SpecialEntity类中,但是这迫使我添加主键,这是我不想要的,因为在子实体之间它并不总是相同的。除此SpecialEntity没有数据库关系之外,它不是真实的实体。

1 个答案:

答案 0 :(得分:0)

解决方案非常简单。感谢@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;

    ...

}