Я пытаюсь сохранить несколько новых объектов в базе данных через родительский объект cascadeType. Структура выглядит следующим образом:
Машина (здесь определен cascadeType ALL)
ProductLinkBox (здесь определен cascadeType ALL)
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.
Да, они помечены @Entity.
@QBrute добавил классы.
Мне удалось решить проблему. Идем дальше и следуем руководству Vlad Mihalceas по сопоставлениям OneToOne в сочетании со ссылкой на github. Сохранение работало нормально после удаления ненужных сопоставлений идентификаторов в моих классах ProductLinkMetaData и FirmwareMetaData. Гайд можно найти здесь: vladmihalcea.com/…
Решено, следуя инструкциям Vlad Mihalceas OneToOne по сопоставлению в сочетании с кодом из его ссылки на github. Удаление ненужных сопоставлений идентификаторов с сущностями и использование общего PK сделали свое дело.
CascadeType.ALL
включаетCascadeType.PERSIST
, так что должно работать.MachineData
иMachineMetaData
снабжены аннотациями@Entity
? Пожалуйста, опубликуйте фактический код этих классов. Это делает вещи намного проще.