У меня есть 3 объекта: Пользователь, Заказ, Элемент с таким отображением:
@Entity
public class Item {
@Id
@Access(AccessType.PROPERTY)
private long id; // item id predefined
//..getters and setters
}
@Entity
public class Client {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
//...getters and setters
}
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
@Access(AccessType.PROPERTY)
private Long id;
@ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = {
CascadeType.PERSIST, CascadeType.MERGE,
CascadeType.REFRESH, CascadeType.DETACH
})// without removing
//@JoinColumn(name = "client_id") - works fine
@JoinTable(name = "client_cr_order_cr_item",
joinColumns = @JoinColumn(name = "order_id"),
inverseJoinColumns = @JoinColumn(name = "client_id"))
private Client client;
@NotEmpty
@OneToMany(fetch = FetchType.LAZY, cascade = {
CascadeType.PERSIST, CascadeType.MERGE,
CascadeType.REFRESH, CascadeType.DETACH
})// without removing
@JoinTable(name = "client_cr_order_cr_item",
joinColumns = @JoinColumn(name = "order_id"),
inverseJoinColumns = @JoinColumn(name = "item_id"))
private List<Item> items;
//...getters and setters
}
При сохранении заказа происходит сбой с ошибкой:
ОШИБКА: нулевое значение в столбце "item_id" нарушает ненулевое ограничение
он генерирует запрос следующим образом:
insert into client_cr_order_cr_item (client_id, order_id) values ()
т.е. он не заполняет полеgment_id по какой-то причине, которую я не знаю. Но я обращаюсь к клиенту не через 3-ю таблицу, а используя FK @JoinColumn(name = "client_id")
, тогда он генерирует правильный запрос:
insert into order_cr_item (order_id, item_id) values ()
Пожалуйста, не могли бы вы объяснить это поведение? Почему отображение клиентов влияет на элементы? Есть ли какой-нибудь намек на то, чтобы hibernate сохранял предметы в 3-й таблице?