У меня есть два класса, и я пытаюсь выполнить каскадное сохранение-обновление, используя аннотации hibernate и JPA, но когда я пытаюсь сохранить объект Order, я получаю исключение, описанное ниже:
Вот класс Order
@Entity
@Table(name="orders")
public class Order {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
private Integer idOc;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL ,mappedBy = "order")
@Valid
private List<OrderLine> lines = new ArrayList<OrderLine>(Arrays.asList(new OrderLine()));
// getters and setters
}
И вот мой класс OrderLine
@Entity
@Table(name="orderLines ")
public class OrderLine {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
private Integer idOl;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "idOc")
private Order order;
// getters and setters
}
Вот исключения, которые я получаю:
1 - org.hibernate.exception.ConstraintViolationException: не удалось выполнить оператор.
2 - Вызвано: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Столбец 'idOl' не может быть нулевым.
IdOl, должно быть, назначается спящим генератором, но каким-то образом он не работает. Есть идеи?
Обновление: на консоли я вижу, что Hibernate выполняет вставку в родительской таблице, но когда он пытается сделать вставку в дочерней таблице, генерируется исключение. Я вижу, что Hibernate не оценивает значение автоинкремента для каждого элемента, содержащегося в List <>, но я не могу понять, почему.
Я полагаюсь на реальный объект последовательности DB. например, на уровне класса:
@SequenceGenerator(
name="SEQ_ORDER",sequenceName="SEQ_ORDER", allocationSize=1, initialValue=1)
И затем используйте ту же последовательность в атрибуте GeneratedValue
поля Id
. например
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_ORDER")
@Column(name="ID", nullable=false)
protected Integer id;