В 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 шт):

Автор решения: denis Krivorutchko

достаточно было бы

@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

→ Ссылка
Автор решения: Roman Konoval

Это похоже на (не совсем корректную) попытку реализовать один из нередко используемых способов получить в сущности идентификатор для ассоциации, когда сама ассоциация не нужна.

Это может быть полезно, например, если сущность Inventory тяжеловесная, а в каких-то сценариях нужно иметь доступ к идентификатору Inventory. Тогда и создается такое поле только для чтения (insertable = false, updatable = false), в которое отображается то же поле из БД.

Для изменения используется inventory, чтение этого поля делается ленивым, этого как раз не хватает в @ManyToOne - нужно добавить fetch = FetchType.LAZY.

→ Ссылка