Hibernate JPA составной ключ - PullRequest
       14

Hibernate JPA составной ключ

0 голосов
/ 27 июня 2018

Entity Relationship

Я очень новичок в 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.

Любая помощь будет принята с благодарностью. - Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...