Java и Hibernate - Как установить связь OneToOne с SuperMappedClass, а не с сущностью - PullRequest
1 голос
/ 29 мая 2019

У меня есть дерево Сущности: Client, ClientConfigurationA и ClientConfigurationB.

Я пытаюсь сделать что-то вроде:

@Entity
@Table(name = "CLIENT")
public class Client {

    @Id
    private int id;

    @OneToOne(mappedBy = "client")
    private ClientConfiguration configuration

    // some getter and setter
}

@MappedSuperClass
public class ClientConfiguration {

    @Id
    private int id;

    @OneToOne
    @MapsId
    protected Client client;

    // getters and setters
}

@Entity(name = "CLIENT_CONF_A")
public class ClientConfigurationA extends ClientConfiguration { ... }

@Entity(name = "CLIENT_CONF_B")
public class ClientConfigurationB extends ClientConfiguration { ... }

Но на самом деле я не могу определить OneToOne, относящийся к MappedSuperClass, а не к сущности.

Так, каков наилучший способ реализовать это дело?

Я уже пробовал это решение без успеха.

Спасибо за чтение.

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

После многих попыток я наконец преуспел.

@Entity
@Table(name = "CLIENT")
public class Client {

    @Id
    private int id;

    @OneToOne(mappedBy = "client")
    private ClientConfiguration configuration

    // some getter and setter
}

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name = "TYPE")
public abstract class ClientConfiguration {

    @Id
    private int id;

    @Column(name = "TYPE")
    private String type;

    @OneToOne
    @MapsId
    protected Client client;

    // getters and setters
}

@Entity(name = "CLIENT_CONF_A")
public class ClientConfigurationA extends ClientConfiguration { ... }

@Entity(name = "CLIENT_CONF_B")
public class ClientConfigurationB extends ClientConfiguration { ... }
0 голосов
/ 29 мая 2019

Это невозможно, и вот почему:

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

Проблема возникает с @MappedSuperClass в том, чтоон не определяет таблицу, поэтому несколько объектов могут быть унаследованы от этого класса, каждый из которых имеет свою таблицу.Hibernate просто не мог знать, к какой таблице присоединиться.

Если вы хотите иметь общий суперкласс, я предлагаю использовать абстрактный @Entity класс.

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