JPA - какую аннотацию использовать для базового класса - PullRequest
0 голосов
/ 18 ноября 2018

Я относительный новичок в JPA, и я читал книги (Java Persistence с Hibernate, Pro JPA 2 - Освоение API Java Persistence), выполнил поиск в Google, но мне не удалось найти решение в следующей ситуации.

У меня есть базовый класс History, который содержит всю постоянную информацию, необходимую для хранения членов данных класса в базе данных. Однако у класса есть абстрактный метод, который необходимо переопределить в производных классах. Производные классы не имеют никакой собственной информации о постоянстве. Они существуют исключительно по двум причинам:

  1. для уникальной реализации абстрактного метода, определенного в базе Класс истории
  2. чтобы сохранить данные в своей собственной таблице

Код ниже должен прояснить это.

@??? What annotation should I use here?
public abstract class History
{
   @Id @GeneratedValue   
   private   int    id;           // primary key
   @Lob @Column(columnDefinition="mediumtext", length=65535)
   protected String string;       // string containing history

   public abstract String foo();
}

@Entity
@Table(name="derived_history_1")
public class Derived1 extends History
{
   public String foo()
   {
      return "Hello";
   }
}

@Entity
@Table(name="derived_history_2")
public class Derived2 extends History
{
   public String foo()
   {
      return "World";
   }
}

Я не думал, что @Inheritance (стратегии = InheritanceType.JOINED) имеет смысл, потому что ничто не наследуется в производных классах, которые должны быть постоянными.

Я пробовал @MappedSuperclass, но тогда CascadeType.PERSIST и CascadeType.MERGE не работали, когда производные классы были членами данных другого класса. Например,

@Entity
@Table(name="part")
public class Part
{
...

   @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}, optional=false, fetch=FetchType.LAZY)
   @JoinColumn(name="history_id")                                            // foreign key into history_part table
   protected Derived1 history;                                            
}

Так что я не мог найти ничего, что бы сработало и соответствовало моей ситуации. Я надеюсь, что объясняю это достаточно хорошо, чтобы люди могли понять. Кто-нибудь знает, как это сделать, это не полный и полный взлом :-) Спасибо за любую помощь.

1 Ответ

0 голосов
/ 18 ноября 2018

Должны работать следующие аннотации:

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

Тип наследования TABLE_PER_CLASS позволяет наследовать сущности для создания собственной таблицы, и вам также нужно сказать, что History также является Entity, даже если у него нет собственной таблицы.

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