Связи между Entity

Базовый Java
≈ 1 мин чтения

Связь объектов должна отражать связь данных

В реляционной базе сущности часто связаны внешними ключами. В объектной модели удобнее работать не с идентификатором владельца, а непосредственно с объектом владельца. JPA позволяет описать эту связь аннотациями.

Many-to-one — частый случай

@Entity
public class Order {

    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

Много заказов могут принадлежать одному пользователю, поэтому со стороны Order это отношение @ManyToOne. @JoinColumn указывает столбец внешнего ключа, через который хранится связь.

Основные виды отношений

  • @OneToOne — одному объекту соответствует один связанный объект;
  • @OneToMany — один объект связан с коллекцией многих объектов;
  • @ManyToOne — многие объекты ссылаются на один;
  • @ManyToMany — коллекции объектов связаны с коллекциями с другой стороны.

У двусторонней связи есть владеющая сторона

@OneToMany(mappedBy = "user")
private List<Order> orders = new ArrayList<>();

mappedBy = "user" показывает, что внешний ключ описан полем user на другой стороне связи. Это важно: две ссылки в Java не означают два независимых отношения в базе.

Следи за обеими сторонами в объектной модели. Если связь двусторонняя, полезно менять обе ссылки согласованно, чтобы объекты в памяти не противоречили друг другу.