JPA Смешанная стратегия наследования - PullRequest
6 голосов
/ 07 октября 2011

У меня есть 3 объекта:

@Entity
public abstract class A {
  @Id
  public Long id;
  public String a1;
  public String a2;
  public String a3;

  //much more fields    
  //getters and setters
}

@Entity
public class B extends A {
  public String b1;
  public String b2;
  public String b3;

  //much more fields
  //getters and setters
}

@Entity
public class C extends A {
  public String c;
  //that's it. no more data

  //getters and setters
}

Я хочу отобразить эти классы на 2 таблицы.Первый будет содержать все данные A и C (т. Е. Наследование SINGLE_TABLE).А второй будет содержать данные B и внешний ключ для A (т. Е. JOINED наследование).

Я попробовал предлагаемое решение здесь , но оно у меня не работает.Атрибуты BB1 и BB2 также включены в A.

Как реализовать такую ​​стратегию?Классы A и C такие же разные, как Dog и Cat, поэтому я не могу объединить их в один класс.

Также я не хочу использовать таблицу на иерархию, которая привела бы к дублированию большого количества данных A.

Ответы [ 2 ]

5 голосов
/ 17 октября 2011

JPA spec (параграф 2.12) говорит, что Support for the combination of inheritance strategies within a single entity inheritance hierarchy is not required by this specification.Помня об этом, в подобных случаях я обычно использую стратегию JOINED для всех своих сущностей.

1 голос
/ 12 октября 2011

Потратив столько времени на это и не получив никакого ответа, я пришел к этому решению (которое может быть не самым лучшим):

@Entity
public abstract class A implements Serializable {
  @Id
  public Long id;

  public String a1;
  public String a2;
  public String a3;

  //much more fields    
  //getters and setters
}

@Entity
public class B implements Serializable {

  @Id  
  @Column(name="id", nullable=false)  
  public Long id;

  @MapsId  
  @OneToOne(optional=false)  
  @JoinColumn(name="id")  
  public A a;

  public String b1;  
  public String b2;  
  public String b3;

  //much more fields
  //getters and setters
}

@Entity
public class C extends A {  

  public String c;
  //that's it. no more data

  //getters and setters
}

Заключение
Я был поражен тем, как такая хорошо поддерживаемая и популярная технология, как JPA, не предлагает решения для такого тривиального случая. Как указал Паскаль Тивент в своем ответе на этот вопрос, Hibernate обманывает нас, используя secondary table, что является очень утомительным и подверженным ошибкам подходом (вы должны вручную указать для каждого поля, к какой таблице оно принадлежит). Похоже, что в JPA spec.

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