Hibernate Один-ко-многим каскад сохраняется для ребенка с составным ключом - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь добиться сохранения родительского объекта со своими дочерними элементами. Дочерний объект имеет составной ключ, который содержит внешний ключ к родительскому.

Текущее сопоставление является однонаправленным для многих, и родителю принадлежат отношения.

Вот моя модель:

Родитель:

@Entity
@Table(name = "PARENT")
public class ParentEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "PARENT_ID")
    private Set<Child> children;

    ...

Ребенок:

@Entity
@IdClass(ChildPK.class)
@Table(name = "CHILD")
public class Child {

    @Id
    @Column(name = "PARENT_ID")
    private Long parentId;

    @Id
    private String source;

    @Id
    private Long alternativeId;

    ...

Кол-во:

class ChildPK implements Serializable {

    private Long parentId;
    private String source;
    private Long alternativeId;

    ...

В настоящее время моя проблема в том, что Hibernate не обрабатывает заполнение parentId в Child, что, как мне кажется, просто я надеюсь, что это произойдет, и я получаю нарушение ограничения на ребенка. Я ищу идеи о том, как мне добиться создания родительского объекта, содержащего его детей, и сохранить все это за один раз.

Спасибо за вашу помощь,

1 Ответ

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

Я задал очень похожий вопрос здесь .Взгляните на вопрос и ответ (который работал).

По сути, вы можете попробовать это:

@Entity
@Table(name = "PARENT")
public class ParentEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;

    @OneToMany(mappedBy="parent", cascade = CascadeType.ALL)
    private Set<Child> children = new HashSet<>();

    public void addChild(Child child){
       child.setParentId(this.id);
       children.add(child);
    }
    ...

и

@Entity
@IdClass(ChildPK.class)
@Table(name = "CHILD")
public class Child {

    @Id
    @Column(name = "PARENT_ID")
    private Long parentId;

    @Id
    private String source;

    @Id
    private Long alternativeId;

    ...

с тем жеChildPk.Обратите внимание, что на родительской стороне мы используем mappedBy, за которым следует имя свойства Java, а не @JoinColumn, потому что родитель не может быть владельцем ассоциации (см. Также этот вопрос ).Также полезно иметь метод addChild, который правильно устанавливает свойства по обе стороны отношения.

Success!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...