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

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

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

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

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

codeLover 27.06.2018 05:20

добавлен сервисный код для деталей сохранения и исключения

Jay 27.06.2018 08:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
87
0

Другие вопросы по теме