Соединить столбец из отношения полиморф c с типом ссылки c - PullRequest
0 голосов
/ 28 марта 2020

Скажем, у меня есть следующие глупые примеры:

@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

...