JPA и наследство - PullRequest
       8

JPA и наследство

1 голос
/ 03 октября 2008

У меня есть несколько сущностей JPA, которые наследуются друг от друга и используют дискриминатор, чтобы определить, какой класс должен быть создан (пока не проверено).

@Entity(name="switches")
@DiscriminatorColumn(name="type")
@DiscriminatorValue(value="500")
public class DmsSwitch extends Switch implements Serializable {}

@MappedSuperclass
public abstract class Switch implements ISwitch {}

@Entity(name="switch_accounts")
public class SwitchAccounts implements Serializable {
    @ManyToOne()
    @JoinColumn(name="switch_id")
    DmsSwitch _switch;
}

Так что в классе SwitchAccounts я хотел бы использовать базовый класс Switch, потому что я не знаю, какой объект будет создан до времени выполнения. Как мне этого добиться?

Ответы [ 3 ]

2 голосов
/ 04 октября 2008

Как и предыдущие комментаторы, я согласен, что модель класса должна отличаться. Я думаю, что-то вроде следующего будет достаточно:

@Entity(name="switches")
@DiscriminatorColumn(name="type")
@DiscriminatorValue(value="400")
public class Switch implements ISwitch {
  // Implementation details
}

@Entity(name="switches")
@DiscriminatorValue(value="500")
public class DmsSwitch extends Switch implements Serializable {
  // implementation
}

@Entity(name="switches")
@DiscriminatorValue(value="600")
public class SomeOtherSwitch extends Switch implements Serializable {
  // implementation
}

Возможно, вы можете предотвратить создание экземпляра Switch напрямую, сделав конструктор защищенным. Я верю, что Hibernate принимает это.

1 голос
/ 03 октября 2008

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

0 голосов
/ 03 октября 2008

Я не думаю, что вы можете с вашей текущей объектной моделью. Класс Switch не является сущностью, поэтому его нельзя использовать в отношениях. Аннотация @MappedSuperclass предназначена для удобства, а не для написания полиморфных объектов. Нет таблицы базы данных, связанной с классом Switch.

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

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