Можно ли одновременно объединить несколько непостоянных дочерних объектов?

Я пытаюсь сохранить несколько новых объектов в базе данных через родительский объект cascadeType. Структура выглядит следующим образом:

Машина (здесь определен cascadeType ALL)

  • ПродуктLinkBox

ProductLinkBox (здесь определен cascadeType ALL)

  • ProductLinkMetaData

ProductLinkMetaData (здесь определен cascadeType ALL)

  • ПрошивкаМетаДанные

В конце я вызываю MachineRepository.save для машинного объекта. Объект Machine и ProductLinkBox успешно сохраняется, но больше ничего. Нужно ли мне вручную сохранять все остальные типы? Разве спящий режим не может автоматически сохранять все другие родительско-дочерние отношения?

Machine.java

@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "TAB_MACHINE")
public class Machine extends AbstractEntity {

  @Id
  @Column(name = "ID")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "machineIdGenerator")
  @SequenceGenerator(
      name = "machineIdGenerator",
      sequenceName = "SEQ_MACHINE_ID",
      allocationSize = 1,
      initialValue = 10)
  Long id;


  @OneToMany(cascade = CascadeType.ALL, mappedBy = "machine", fetch = FetchType.LAZY, orphanRemoval = true)
  private List<ProductLinkBox> productLinkBoxes;

ProductLinkBoxes.java

@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "TAB_PRODUCT_LINK_BOX")
public class ProductLinkBox extends AbstractEntity {

  @Id
  @Column(name = "ID")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "productLinkBoxIdGenerator")
  @SequenceGenerator(
      name = "productLinkBoxIdGenerator",
      sequenceName = "SEQ_PRODUCT_LINK_BOX_ID",
      allocationSize = 1,
      initialValue = 10)
  Long id;

  @ManyToOne
  @JoinColumn(name = "MACHINE_ID")
  private Machine machine;

  @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "productLinkBox")
  private ProductLinkMetaData productLinkMetaData;

ProductLinkMetaData.java

@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "TAB_PRODUCT_LINK_META_DATA")
public class ProductLinkMetaData extends AbstractEntity {

  @Id
  @Column(name = "ID")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "productLinkMetaDataIdGenerator")
  @SequenceGenerator(
      name = "productLinkMetaDataIdGenerator",
      sequenceName = "SEQ_PRODUCT_LINK_META_DATA_ID",
      allocationSize = 1,
      initialValue = 10)
  Long id;

  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "PRODUCT_LINK_BOX_ID")
  @MapsId
  private ProductLinkBox productLinkBox;

  @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "productLinkMetaData")
  private FirmwareMetaData firmwareMetaData;

ПрошивкаMetaData.java

@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "TAB_FIRMWARE_META_DATA")
public class FirmwareMetaData extends AbstractEntity {

  @Id
  @Column(name = "ID")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "firmwareMetaDataIdGenerator")
  @SequenceGenerator(
      name = "firmwareMetaDataIdGenerator",
      sequenceName = "SEQ_FIRMWARE_META_DATA_ID",
      allocationSize = 1,
      initialValue = 10)
  Long id;

  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "PRODUCT_LINK_META_DATA_ID")
  @MapsId
  private ProductLinkMetaData productLinkMetaData;

Обновлено: Решено, следуя инструкциям по сопоставлению Vlad Mihalceas OneToOne в сочетании с кодом из его ссылки на github.

CascadeType.ALL включает CascadeType.PERSIST, так что должно работать. MachineData и MachineMetaData снабжены аннотациями @Entity? Пожалуйста, опубликуйте фактический код этих классов. Это делает вещи намного проще.
QBrute 31.03.2023 15:53

Да, они помечены @Entity.

benjaminv2 31.03.2023 15:56

@QBrute добавил классы.

benjaminv2 31.03.2023 16:10

Мне удалось решить проблему. Идем дальше и следуем руководству Vlad Mihalceas по сопоставлениям OneToOne в сочетании со ссылкой на github. Сохранение работало нормально после удаления ненужных сопоставлений идентификаторов в моих классах ProductLinkMetaData и FirmwareMetaData. Гайд можно найти здесь: vladmihalcea.com/…

benjaminv2 03.04.2023 13:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решено, следуя инструкциям Vlad Mihalceas OneToOne по сопоставлению в сочетании с кодом из его ссылки на github. Удаление ненужных сопоставлений идентификаторов с сущностями и использование общего PK сделали свое дело.

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