@JoinColumn и mappedBy для владения стороной и обратной стороной - PullRequest
1 голос
/ 04 июля 2019

У меня есть вопрос относительно @JoinColumn и mappedBy в спящем режиме, после того, как я прочитал так много постов в stackoverflow и других блогах, я все еще путаюсь.

Возьмите это в качестве примера, у каждого сотрудника есть много электронных писем, и один сотрудник может владеть многими электронными письмами:

enter image description here

Первое утверждение: Электронная почта - это владеющая сторона , поскольку она имеет внешний ключ к таблице Employee, обычно в отношении, стороне "Many" владеющая сторона.

В спящем режиме для двунаправленных отношений:

Employee

@Entity
@Table(name = "employee")
public class Employee{

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "employee")
    private List<Email> emails = new ArrayList<>();

    //Constructors, getters and setters removed for brevity
}

E-mail

@Entity
@Table(name = "email")
public class Email{

    @Id
    @GeneratedValue
    private Long id;

    private String email;

    @ManyToOne
    @JoinColumn(name = "employee_id")
    private Employee employee;

    //Constructors, getters and setters removed for brevity
}

Итак, из того, что я прочитал, обычно @JoinColumn находится на стороне владельца, где mappedBy на обратной стороне.

Но я также где-то читал, что @JoinColumn на обратной стороне, а mappedBy на стороне владельца.

Я в замешательстве, какой уместен?

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

@ Аннотация JoinColumn поддерживается в классе, которому принадлежит внешний ключ.Согласно вашему коду, класс Email будет использовать аннотацию @JoinColumn, указывающую ссылку на внешний ключ.Это фактически способствует отображению между двумя таблицами, потому что в этой аннотации вы указываете имя столбца моста "employee_id".

С другой стороны, mappedBy просто используется для включения двунаправленного отображения между сущностями. Так что он должениспользоваться на обратной стороне (не владеющий классом).

2 голосов
/ 04 июля 2019

Пользователь -> Актив (один ко многим)

Employee.java

 @JsonBackReference
 @OneToMany(mappedBy="user",fetch=FetchType.LAZY)
 private List<Asset> asset = new ArrayList<>();

Asset.java

    @JsonManagedReference
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name="id", nullable = false)
    private User user;

@JoinColumn

  • Если объединение для сопоставления OneToOne или ManyToOne с использованием стороннего Стратегия сопоставления клавиш, столбец внешнего ключа находится в таблице исходный объект или встраиваемый.
  • Если соединение предназначено для однонаправленного сопоставления OneToMany с использованием стороннего стратегия сопоставления клавиш, внешний ключ находится в таблице цели юридическое лицо.
  • Если объединение для сопоставления ManyToMany или для OneToOne или двунаправленное отображение ManyToOne / OneToMany с использованием таблицы соединений, внешний ключ находится в соединительной таблице.
  • Если соединение предназначено для коллекции элементов, внешний ключ находится в Стол для сбора.

mappedBy

Применять ли операцию удаления к объектам, которые были удалены из отношения, и каскадно удалять операцию для этих объектов

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