Я очень новичок в Java и JPA / hibernate. Для описанной выше структуры таблицы я создал следующие Сущности.
Таблица 1:
@Entity
public class Table1 implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "work_item_no")
private String workItemNo;
@OneToMany(mappedBy = "tcTcr", cascade = CascadeType.ALL)
private List<Table2> table2;
Таблица 2:
@Entity
@Table(name = "Table2")
public class Table2 implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "errtrack_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long errtrackId;
@ManyToOne
@JoinColumn(name = "work_item_no")
private Table1 table1;
@OneToOne(fetch = FetchType.LAZY, mappedBy = "table2", cascade = CascadeType.ALL)
private Table3 table3;
@OneToMany(mappedBy = "table2", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Table4> table4s = new ArrayList<Table4>();
Таблица 3:
@Entity
public class Table3 implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "errtrack_id")
private long errtrackId;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "errtrack_id")
@MapsId
private Table2 table2;
Таблица 4:
@Entity
@IdClass( Table4PK.class )
public class Table4 implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "errtrack_id")
private long errtrackId;
@Id
@Column(name = "line_item_no")
private int lineItemNo;
@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name = "errtrack_id",referencedColumnName = "errtrack_id")
@MapsId
private Table2 table2;
Table4PK:
public class Table4PK implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "errtrack_id")
private long errtrackId;
@Column(name = "line_item_no")
private int lineItemNo;
Я сохраняю Table1 с помощью JpaRepository.save.
Table1 table1 = trans.GetTable1();
List<Table2> tb2Arr = new ArrayList<Table2>();
for (Task task : request.getTasks()) {
Table2 table2 = trans.GetTable2(task);
table2.setTable1(table1);
Table3 table3 = trans.GetTable3());
table2.setTable3(table3);
table3.setTable2(table2);
int index = 0;
for (Trade trade : table2.getTable4s()) {
index++;
Table4 table4 = trans.GetTable4(trade, index);
table4.setTable2(table2);
table2.getTable4s().add(table4);
}
tb2Arr.add(table2);
}
table1.setTable2s (tb2Arr); Таблица1 savedTable1 = table1Repo.save (таблица1);
У меня все работает до Table3. Но Table4 не сохраняется, потому что автоматически сгенерированное значение не заполняется.
Таблица 4 имеет составной ключ, а одно поле в составном ключе - это foriegn_key из другой таблицы.
Ошибка:
o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 547, SQLState: 23000
2018-06-27 02:01:15.453 ERROR 15512 --- [nio-8090-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : The INSERT statement conflicted with the FOREIGN KEY constraint...
В профилировщике я вижу, что сгенерированный errtrack_id из Table2 не заполняется в Table4.
Любая помощь будет принята с благодарностью. - Спасибо.
добавлен сервисный код для деталей сохранения и исключения




Можете ли вы показать полученное исключение и код вашей службы для хранения данных?