Hibernate JPA OneToOne Отношения с внешним ключом - PullRequest
2 голосов
/ 09 апреля 2019

Я хотел бы создать отношение OneToOne между двумя объектами (также таблицами в mysql).Когда я получаю пост-запрос, я хочу сохранить сущность A, а затем сущность B сохраняется автоматически, потому что в B есть столбец («a_id»), который является внешним ключом первичного ключа в A («id_a»).Как я могу отобразить их correyl?

@Table("a_tb")
public class A(){
    @Column(name="id_a")
    private Long idA;
    @OneToOne(mappedBy = "aId", cascade = CascadeType.ALL,
        fetch = FetchType.LAZY, orphanRemoval = true, optional = false)
    private B b;
}
@Table("b_tb")
public class B(){
    @Column(name="id_b")
    private Long idB;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id")
    private Long aId;
}

Попытался установить idA в тип A, но когда я вызываю метод get, он зацикливает вызов A с вложенным B, который является вложенным A и так далее ... Iпросто хочу сохранить идентификатор A в B, а не весь объект, иначе он вернет весь объект, когда я вызову метод get и цикл вернется.Отображение правильное, а не автоматическая установка значения в a_id в B.

Я ожидаю, что: когда я создаю A, B получает автоматически идентификатор A и сохраняет его в своемстолбец ("id_a") в db, когда я запрашиваю сохранить объект A. Это должно работать и с delete (когда я удаляю A, B тоже удаляется).Соответствующий JSON будет:

{
 "a":{
      "id_a": "value",
     },
 "b":{
      "id_b": "value",
      "a_id": "id_a"
     }
 }

Спасибо за совет.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Вам необходимо предоставить однозначное сопоставление [Ссылка] в обоих классах. Если родительская ссылка не установлена ​​автоматически, вы можете создать временную переменную и установить первичный ключ родителя, используя ее.

Попробуйте этот пример:

@Table("a_tb")
    public class A(){
        @Column(name="id")
        private Long id;
        @OneToOne(mappedBy = "aId", cascade = CascadeType.ALL,
            fetch = FetchType.LAZY, orphanRemoval = true, optional = false)
        private B b;
    }

    @Table("b_tb")
    public class B(){
        @Column(name="id")
        private Long id;
        @OneToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "a_id")
        private A a;

        @Transient
        private Long aId;

        // getters and setters

        public void setAId(Long aId){
            if(aId != null){ 
               this.a = new A();
               this.a.setId(aId);
            }
        }
    }
0 голосов
/ 09 апреля 2019

с первого взгляда выглядит так:

@OneToOne
@JoinColumn(name = "idA_id")
A a; 

- это то, что вам нужно, и

...