Могу ли я составить спящий субъект? - PullRequest
0 голосов
/ 28 января 2019

У меня есть проект, который я недавно унаследовал, в котором есть 2 таблицы, которые имеют много общих полей.Я новичок в спящем режиме и хочу знать, могу ли я использовать композицию для генерации таблицы вместо наследования?B и D - это один и тот же класс с другим именем таблицы.

Текущая иерархия

  • B расширяет A расширяет BaseClass
  • D расширяет C расширяет BaseClass

Моя проблема на данный момент заключается в том, что многие другие классы расширяют BaseClass, у которого нет общих полей, а 2 дочерних класса не имеют общего родителя, поэтому я не могу добавить еще один уровень в иерархию.и используйте @MappedSuperclass.

В связи с этим я хотел бы знать, могу ли я сгруппировать свои общие поля в один класс и каким-то образом собрать свои дочерние классы с этим новым классом?

Извинения за загадочные имена, но каквсегда;конфиденциальность ...

edit - нашел что-то похожее с @Embeddable https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/domain/embeddables.html

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вы можете использовать @Embedded и встраивать один и тот же объект для B и D, возможно, что-то вроде:

@Embeddable
public class CommonFieldObject {
  @Column(name="COMFIELD1")
  private String commonField1;

  @Column(name="COMFIELD2")
  private String commonField2;

  ...
}



@Table
public class C extends A {
  @Embedded
  @AttributeOverrides({
    @AttributeOverride(name="commonField1", column=@Column(name="CFO_COMFIELD1")),
    @AttributeOverride(name="commonField2", column=@Column(name="CFO_COMFIELD2"))
  })
  private CommonFieldObject commonFieldObj; //CFO_ prefix for this reference - in case we have a second field referencing a CommonFieldObject - use a different prefix..

  ...
}

Затем вы должны получить столбцы CFO_COMFIELD1 и CFO_COMFIELD2 в своей таблице, и вы можете перезапуститьCommonFieldObject для класса D.

0 голосов
/ 28 января 2019

Если вы используете интерфейс JPA для Hibernate, вы можете использовать @Embedded и @Embeddable, чтобы получить более или менее то, что вы хотите.Имейте в виду, что изменение не будет прозрачным: где у вас было:

@Entity
public class B extends A {
    @Basic
    private int foo;
    ...
}

, на которое вы ссылались в JPQL с помощью b.foo, у вас будет:

@Embeddable
public classs Common {
    @Basic 
    private int foo;
    ...
}

@Entity
public class B extends A {
    @Embedded
    private Common common;
    ...
}

, которое вы будетессылаться на JPQL, используя b.common.foo.

Подробнее о встраиваемых объектах здесь: https://en.wikibooks.org/wiki/Java_Persistence/Embeddables

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