Обратный вызов Jpa preperist не вызван на родителя

1

Мой код

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class SiteMessage implements Identifiable{
    @PrePersist
    public void onCreate1(){
        System.out.println("Executed onCreate1");
    }
}

@Entity
@Table(name = "feedback")
public class Feedback extends SiteMessage {
    @PrePersist
    public void onCreate2(){
        System.out.println("Executed onCreate2");
    }
}

Когда я сохраняю объект обратной связи, я ожидаю, что увижу: Executed onCreate1 и Executed onCreate2, но я видел только Executed onCreate2

Я использую eclipselink v2.5.2

  • 3
    Вставлены ли обе записи таблицы? OTOH, если бы я сохранил экземпляр подкласса, я бы ожидал, что будет @PrePersist метод @PrePersist этого подкласса, но не суперкласс ». В конце концов, подкласс - это полная сущность, которая будет сохранена в двух таблицах, но все равно будет одним объектом.
  • 0
    У меня есть поле даты в моем родительском классе, и я хочу установить текущее время при создании новой записи в базе данных
Показать ещё 2 комментария
Теги:
jpa
eclipselink

1 ответ

7

В книге "Освоение Java Persistence API" указано следующее:

Наследование методов обратного вызова

Способы обратного вызова могут возникать на любом объекте или сопоставленном суперклассе, будь то абстрактным или конкретным. Правило довольно простое. Это то, что каждый метод обратного вызова для данного типа события будет вызываться в порядке в соответствии с его местом в иерархии, в первую очередь, с большинством общих классов. Таким образом, если в нашей иерархии Employee, которую мы видели на рисунке 10-10, класс Employee содержит метод обратного вызова PrePersist с именем checkName(), а FullTimeEmployee также содержит метод обратного вызова PrePersist с именем verifyPension(), когда происходит событие PrePersist, checkName ( ) вызовет метод, за которым следует метод verifyPension().

Поэтому, если все остальное в вашем исходном коде было правильным, вы должны ожидать увидеть как onCreateOne(), так и onCreateTwo() и в этом порядке.

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class SiteMessage implements Identifiable{
    @PrePersist
    public void onCreateOne(){
        System.out.println("Executed onCreate1"); //executes first
    }
}

@Entity
@Table(name = "feedback")
public class Feedback extends SiteMessage {
    @PrePersist
    public void onCreateTwo(){
        System.out.println("Executed onCreate2"); //executes second
    }
}

Далее следует отметить следующее, чтобы вы могли настроить все, что требуется.

Мы также могли бы использовать метод сопоставленного суперпредложения CompanyEmployee, который мы хотим применить ко всем сущностям, которые подклассифицировали его. Если мы добавим метод PrePersist с именем checkVacation(), который проверяет, что перенос отпуска меньше определенной суммы, он будет выполнен после checkName() и до verifyPension(). Это становится более интересным, если мы определяем метод checkVacation() в классе PartTimeEmployee, потому что сотрудники, занятые неполный рабочий день, не получают столько отпусков. Аннотирование переопределенного метода с помощью PrePersist приведет к вызову метода PartTimeEmployee.checkVacation() вместо имени в приложении CompanyEmployee

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class SiteMessage implements Identifiable{
    @PrePersist
    public void onCreate(){
        System.out.println("Executed onCreate1"); //will not execute
    }
}

@Entity
@Table(name = "feedback")
public class Feedback extends SiteMessage {
    @PrePersist
    public void onCreate(){
        System.out.println("Executed onCreate2"); //will execute
    }
}
  • 0
    Это не то, что мне нужно. Мне нужен только один обратный вызов в моем родительском классе, но он не работает (даже если я удаляю обратный вызов из дочернего класса).
  • 0
    Первый - не та работа, которую я ожидаю. Метод onCreateOne () не выполнен. Я видел только "Executed onCreate2"
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню