JPA сохраняет дочернюю сущность без составного ключа ⇐ JAVA
JPA сохраняет дочернюю сущность без составного ключа
У меня есть две сущности, назовем их Родитель и Дочерний.
Родитель:
@Getter @Сеттер @Сущность @IdClass(ParentId.class) публичный класс Родитель { @Идентификатор @ManyToOne @JoinColumn(name = "external1_id", nullable = false) частный Внешний1 внешний1; @Идентификатор @ManyToOne @JoinColumn (имя = «external2_id», nullable = false) частный Внешний2 внешний2; @OneToMany(mappedBy = "родитель", cascade = CascadeType.ALL, orphanRemoval = true) частные дети Set = новый LinkedHashSet(); } Ребенок:
@Getter @Сеттер @Сущность общественный класс Child { @Идентификатор @GeneratedValue(стратегия = GenerationType.AUTO) @Column(name = "id", nullable = false) частный длинный идентификатор; @ManyToOne (необязательно = ложь) @JoinColumn(name = «parent_external1_id», referencedColumnName = «external1_id») @JoinColumn(name = «parent_external2_id», referencedColumnName = «external2_id») частный Родитель-родитель; } Сохранение:
var external1 = ... вар внешний2 = ... вар child1 = новый ребенок (); вар child2 = новый ребенок (); список вар = List.of(child1,child2); вар родитель = новый родитель (); родитель.setExternal1(внешний1); родитель.setExternal2(внешний2); родитель.setChildren(список); родительскийрепозиторий.save(родительский); Как вы можете видеть здесь, я пытаюсь автоматически вставить дочерние элементы в соответствующую таблицу, но, поскольку у нее есть ссылка на родительскую таблицу, необходимо автоматически вставить составной ключ родительского элемента в дочернюю таблицу. Это отлично работает с простым первичным ключом (длинным). Здесь он создает DataIntegrityViolationException, поскольку пытается вставить дочерний элемент в виде строки (null,null).
Я слегка абстрагировал остальные свойства, чтобы сделать пример более понятным. Как я могу это исправить?
У меня есть две сущности, назовем их Родитель и Дочерний.
Родитель:
@Getter @Сеттер @Сущность @IdClass(ParentId.class) публичный класс Родитель { @Идентификатор @ManyToOne @JoinColumn(name = "external1_id", nullable = false) частный Внешний1 внешний1; @Идентификатор @ManyToOne @JoinColumn (имя = «external2_id», nullable = false) частный Внешний2 внешний2; @OneToMany(mappedBy = "родитель", cascade = CascadeType.ALL, orphanRemoval = true) частные дети Set = новый LinkedHashSet(); } Ребенок:
@Getter @Сеттер @Сущность общественный класс Child { @Идентификатор @GeneratedValue(стратегия = GenerationType.AUTO) @Column(name = "id", nullable = false) частный длинный идентификатор; @ManyToOne (необязательно = ложь) @JoinColumn(name = «parent_external1_id», referencedColumnName = «external1_id») @JoinColumn(name = «parent_external2_id», referencedColumnName = «external2_id») частный Родитель-родитель; } Сохранение:
var external1 = ... вар внешний2 = ... вар child1 = новый ребенок (); вар child2 = новый ребенок (); список вар = List.of(child1,child2); вар родитель = новый родитель (); родитель.setExternal1(внешний1); родитель.setExternal2(внешний2); родитель.setChildren(список); родительскийрепозиторий.save(родительский); Как вы можете видеть здесь, я пытаюсь автоматически вставить дочерние элементы в соответствующую таблицу, но, поскольку у нее есть ссылка на родительскую таблицу, необходимо автоматически вставить составной ключ родительского элемента в дочернюю таблицу. Это отлично работает с простым первичным ключом (длинным). Здесь он создает DataIntegrityViolationException, поскольку пытается вставить дочерний элемент в виде строки (null,null).
Я слегка абстрагировал остальные свойства, чтобы сделать пример более понятным. Как я могу это исправить?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение