Я очень новичок в Java и JPA / hibernate.
Для описанной выше структуры таблицы у меня созданы следующие сущности.
Table1:
@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;
Table2:
@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);
Table1 saveTable1 = table1Repo.save (table1);
У меня все работает до Таблицы3. Но Таблица4 не сохраняется, потому что автоматически сгенерированное значение не заполняется.
В Table4 есть составной ключ, и одно поле в ключе compiste является ключом 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
из таблицы 2 не заполняется в таблице 4.
Любая помощь будет принята с благодарностью. - Спасибо.