В Entity классе две ссылки на одно и тоже поле в БД
Изучаю учебный проект - работа с базами данных. Вот класс описывающий сущность
@Entity
@Table(name = "pricelists", schema = "inventories")
public class PriceList {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "id_inventory", insertable = false, updatable = false)
private Long idInventory;
@ManyToOne
@JoinColumn(name = "id_inventory", nullable = false)
private Inventory inventory;
private Integer price;
}
И тут две переменные, которые ссылаются на одно и тоже поле в таблице базы данных. Разве так можно делать? Это не является ошибкой?
Ответы (2 шт):
достаточно было бы
@Entity
@Table(name = "pricelists", schema = "inventories")
public class PriceList {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "id_inventory", nullable = false,insertable = false,
updatable = false)
private Inventory inventory;
private Integer price;
}
но ваш вариант ошибкой не является, тут главное понимать кто будет формировать ddl для вашей таблицы, если это будет делать фреймворк то поле
@Column(name = "id_inventory", insertable = false, updatable = false)
private Long idInventory;
уже не несет в себе информации про внешний ключ так как он уже есть в анотации @JoinColumn
Это похоже на (не совсем корректную) попытку реализовать один из нередко используемых способов получить в сущности идентификатор для ассоциации, когда сама ассоциация не нужна.
Это может быть полезно, например, если сущность Inventory тяжеловесная, а в каких-то сценариях нужно иметь доступ к идентификатору Inventory. Тогда и создается такое поле только для чтения (insertable = false, updatable = false), в которое отображается то же поле из БД.
Для изменения используется inventory, чтение этого поля делается ленивым, этого как раз не хватает в @ManyToOne - нужно добавить fetch = FetchType.LAZY.