Аннотация JoinColumn создает столбец на той же таблице - PullRequest
0 голосов
/ 19 сентября 2019

Я новичок в Hibernate и пытаюсь научиться этому.Я запутался в использовании @JoinColumn.Я знаю, что он создает столбец, чтобы связать две сущности.Я попробовал:

  1. Наличие двух классов Person и House
  2. Класс Person имеет набор домов с отношением OneToMany

In Person Class:

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "person_id")  // this creates a FK on house table  with this name
    private Set<House> houses = new HashSet<House>();

Это создает столбец с именем person_id в таблице House.

В классе дома:

    @ManyToOne
    @JoinColumn(name = "house_id")
    private Person person;

Это снова создает столбец house_idна House столе.Но я ожидал увидеть этот столбец в таблице Person.Почему это работает так?

Я думал, что аннотация @JoinColumn создает в таблице столбец соединения, к которому мы применили эту аннотацию.Так что в этом случае для класса Person он создал person_id на домашнем столе, а для второго я ожидал увидеть house_id на классе person.Но это также создает это на домашнем столе.Так что я в замешательстве.

Так как же это работает на самом деле?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

попробуйте заменить @JoinColumn(name = "house_id") на @JoinColumn(name = "person_id") предположим, что в домике есть столбец с именем person_id

, затем удалите @JoinColumn(name = "person_id") и в аннотации OneToMany добавьте атрибут mappedBy

@OneToMany(cascade = CascadeType.ALL, mappedBy = "person")

таким образомhibernate будет искать все дома, где атрибуты лица соответствуют текущему person_id

0 голосов
/ 20 сентября 2019

@JoinColumn создает столбец , где имеет смысл .

Для @OneToMany с @JoinColumn столбец соединения должен перейти к таблице целевого объекта, т. Е. House.Если столбец был создан в исходной таблице сущностей, т.е. Person, одному человеку может быть назначен только один дом, поэтому это не будет связь один ко многим.

И наоборот, для @ManyToOne с @JoinColumn столбец соединения должен перейти к исходному объекту (т. Е. House).Если вместо этого столбец перешел в таблицу Person, и вы назначили определенного человека одному дому, столбцу PERSON.HOUSE_ID будет присвоен идентификатор этого дома.Тогда не было бы никакой возможности назначить другой дом тому же человеку (поскольку столбец PERSON.HOUSE_ID уже был бы «использован»).По сути, это та же проблема, что и раньше, но она видна со стороны «дома» ассоциации.

...