JPA, как спроектировать несколько таблиц отношения один к одному с общей таблицей - PullRequest
0 голосов
/ 05 июля 2018

У меня есть ситуация, когда несколько таблиц (TableA и TableB) имеют отношение один к одному с одной и той же таблицей (TableC). Таблица A и Таблица B не связаны. Я разработал таблицы, как показано ниже.

TableA
- key
- something
- c_ref_key

TableB
- key
- something
- c_ref_key

TableC
- key
- something

Когда я генерирую сущность JPA из этой базы данных с помощью обратного инжиниринга спящего режима, она создает отношение «многие к одному» в TableA и TableB для TableC. Обычно для создания отношения один-к-одному первичный ключ TableA должен иметь первичный ключ TableA, но, поскольку у меня есть другие таблицы (TableB), которые также имеют однозначное отношение к TableC, я не могу этого сделать. Следовательно, мне пришлось использовать внешний ключ TableC в TableA и TableB (что привело к взаимосвязи многие-к-одному в JPA). Есть ли другой способ дизайна, чтобы отношения оставались один на один? или, по крайней мере, в сгенерированных объектах JPA может быть отношение один к одному?

1 Ответ

0 голосов
/ 05 июля 2018

Вы можете использовать @OneToOne hibernate mapping с @JoinColumn для создания внешнего ключа. Ниже приведена базовая реализация схемы. Вы можете расширить ее в соответствии с вашими требованиями.

TableA.java

    @Entity(name = "TABLE_A")
    public class TableA {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long key_a;

        private String something;

        @OneToOne
        @JoinColumn(name = "c_ref_key", referencedColumnName = "key_c")
        private TableC c_ref_key;
    }

TableB.java

@Entity(name = "TABLE_B")
public class TableB {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long key_b;

    private String something;

    @OneToOne
    @JoinColumn(name = "c_ref_key", referencedColumnName = "key_c")
    private TableC c_ref_key;
}

TableC.java

@Entity(name = "TABLE_C")
public class TableC {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long key_c;

    private String something;
}

Я протестировал эту схему в базе данных MySql, и она отлично работает.

...