Как заставить hibernate вставить значение внешнего ключа вместе с общей вставкой в ​​таблицу? - PullRequest
0 голосов
/ 05 сентября 2018

У меня такое отображение (однонаправленное):

@Entity
@Table(name = "MY_TEMPLATE")
public class MyTemplate {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false, updatable = false)
    private Long id;
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "MY_TEMPLATE_ID")
    private List<MyObject> myObjects = new ArrayList<>();
    ...
}

@Entity
@Table(name = "MY_OBJECT")
public class MyObject implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false, updatable = false)
    private Long id;
}

тогда я пишу код так:

MyTemplate mt = new MyTemplate();
mt.setField1(someVal1);
mt.setField2(someVal2);
mt.setField3(someVal2);

MyObject mdr = new MyObject ();
mt.getMyObjects.add(mdr);//!!!
mdr.setFfld1(smVal1);
mdr.setFfld2(smVal2);
mdr.setFfld3(smVal3);

crudRepository.save (мт);

Hibernate генерирует 3 запроса для этого:

  1. вставить в MY_TEMPLATE для field1, field2 anf field3
  2. вставить в MY_OBJECT для fld1, fld2 и fld3
  3. обновление внешнего ключа набора для MY_OBJECT таблицы

Можно ли заставить Hibernate вставлять FK вместе со вставкой в ​​MY_OBJECT таблицу?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Я сделал следующее, и это помогло:

@JoinColumn(name = "MY_TEMPLATE_ID", nullable = false)
0 голосов
/ 05 сентября 2018

Влад Михалча объясняет это в своей статье о 1-многих отношениях .

Если вы посмотрите на порядок сброса Hibernate, вы увидите, что действие persist выполняется до обработки элементов коллекции. Таким образом, Hibernate сначала вставляет дочерние записи без внешнего ключа, поскольку дочерняя сущность не хранит эту информацию. На этапе обработки коллекции соответствующий столбец внешнего ключа обновляется.

Он рекомендует обратить отношения в отношения @ManyToOne или в двунаправленные отношения, контролируемые стороной many .

...