Обратные вызовы JPA @Pre и @Post не вызваны - PullRequest
1 голос
/ 01 мая 2019

Я использую Spring Boot 2 с JPA поверх Hibernate.

Мне нужно сделать так, чтобы некоторые сущности имели специальную функцию аудита.Я могу просто реализовать это, используя обратные вызовы @PrePersist / @PostPersist в классе сущности.

Я хотел бы поместить эти обратные вызовы в базовый класс.Однако если этот базовый класс является простым Java-классом без аннотации @Entity, то обратные вызовы не вызываются.Если я добавлю также @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 голосов
/ 01 мая 2019

Решение было довольно простым.Благодаря комментарию @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;

    ...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...