Моя модель данных представляет собой юридические лица, такие как Бизнес или Лицо. Оба являются налогоплательщиками, и у обоих есть TaxID, коллекция телефонных номеров и коллекция почтовых адресов.
У меня есть Java-модель с двумя конкретными классами, которые расширяют абстрактный класс. Абстрактный класс имеет свойства и коллекции, общие для обоих конкретных классов.
AbstractLegalEntity ConcreteBusinessEntity ConcretePersonEntity
------------------- ---------------------- --------------------
Set<Phone> phones String name String first
Set<Address> addresses BusinessType type String last
String taxId String middle
Address Phone
------- -----
AbsractLegalEntity owner AbstractLegalEntity owner
String street1 String number
String street2
String city
String state
String zip
Я использую Hibernate JPA Annotations в базе данных MySQL с такими классами:
@MappedSuperclass
public abstract class AbstractLegalEntity {
private Long id; // Getter annotated with @Id @Generated
private Set<Phone> phones = new HashSet<Phone>(); // @OneToMany
private Set<Address> address = new HashSet<Address>(); // @OneToMany
private String taxId;
}
@Entity
public class ConcretePersonEntity extends AbstractLegalEntity {
private String first;
private String last;
private String middle;
}
@Entity
public class Phone {
private AbstractLegalEntity owner; // Getter annotated @ManyToOne @JoinColumn
private Long id;
private String number;
}
Проблема состоит в том, что объекты Phone
и Address
должны ссылаться на своего владельца, который является AbstractLegalEntity
. Hibernate жалуется:
@OneToOne or @ManyToOne on Phone references an unknown
entity: AbstractLegalEntity
Похоже, что это будет довольно распространенный сценарий наследования Java, поэтому я надеюсь, что Hibernate поддержит его. Я попытался изменить отображение для AbstractLegalEntity на основе вопроса форума Hibernate, больше не используя @MappedSuperclass
:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
Однако теперь я получаю следующую ошибку. Когда вы читаете этот тип сопоставления наследования, похоже, что я должен использовать SEQUENCE, а не IDENTITY, а MySQL не поддерживает SEQUENCE.
Cannot use identity column key generation with <union-subclass>
mapping for: ConcreteBusinessEntity
Я делаю больший прогресс в направлении работы, когда я использую следующее сопоставление.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name="entitytype",
discriminatorType=DiscriminatorType.STRING
)
Я думаю, я должен продолжить этот путь. Меня беспокоит, что я сопоставляю его как @Entity
, когда я действительно никогда не хочу, чтобы экземпляр AbstractLegalEntity когда-либо существовал. Я хотел бы знать, правильно ли это. Каков правильный подход, который я должен принять для этой ситуации?