Скажем, у меня есть следующие глупые примеры:
@Entity
class Customer
{
@EmbeddedId CustomerId id;
}
@Entity
class Supplier
{
@EmbeddedId SupplierId id;
}
А затем таблица polymorphi c, скажем, Настройки:
@Entity
@Inheritance(strategy = SINGLE_TABLE)
@DiscriminatorColumn(name = "kind", discriminatorType = STRING)
class Settings
{
@Id Long id;
String kind;
Long referenceId;
boolean dummySetting;
}
@Entity
@DiscriminatorValue(value = "CUSTOMER")
class CustomerSettings extends Settings
{
@JoinColumn("referenceId")
Customer customer;
}
@Entity
@DiscriminatorValue(value = "SUPPLIER")
class SupplierSettings extends Settings
{
@JoinColumn("referenceId")
Supplier supplier;
}
Где CustomerId
и SupplierId
являются сильными типами Long
с соответствующими java.persistence.AttributeConverter
с.
Пока все хорошо, все отображается правильно и работает хорошо.
Но что если я хочу отобразить поле settings
на Supplier
и Customer
сущностях?
С точки зрения базы данных типы совпадают, поскольку все они bigint
s.
From С точки зрения JPA, типы также совпадают, поскольку:
Customer.id
и CustomerSettings.customer.id
тип равен CustomerId
Supplier.id
, а тип SupplierSettings.supplier.id
равен SupplierId
Но если я попробую следующий подход:
@Entity
class Customer
{
@EmbeddedId CustomerId id;
@OneToOne(fetch = LAZY, cascade = ALL)
@JoinColumn(name = "id", referencedColumnName = "referenceId")
CustomerSettings settings;
}
Hibernate жалуется, что я пытаюсь смешивать типы CustomerId
и Long
. Что и ожидается, похоже, мне нужно что-то еще в следующих строках:
@Entity
class Customer
{
@EmbeddedId CustomerId id;
@OneToOne(fetch = LAZY, cascade = ALL)
@JoinFormula(
value = "SELECT settings.id FROM settings WHERE settings.referenceKind = 'CUSTOMER' AND settings.referenceId = id",
referencedColumnName = "id")
CustomerSettings settings;
}
Но гибернация взрывается с NPE при попытке создать EntityManager
, поэтому вышеприведенное, конечно, не правильно, но я могу ' Не могу найти какую-либо подтверждающую документацию / другие вопросы, которые помогли бы мне найти правильную семантику.
Я использую Java 11 и Hibernate 5.4.2.Final