Мой код
@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
В книге "Освоение 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
}
}
@PrePersist
метод@PrePersist
этого подкласса, но не суперкласс ». В конце концов, подкласс - это полная сущность, которая будет сохранена в двух таблицах, но все равно будет одним объектом.