Вложенность нескольких сущностей дает проблемы гибернации - PullRequest
0 голосов
/ 09 февраля 2020

У меня проблема с отображением сущности 3-го уровня, рассмотрите следующий код:

Родительский объект:

@Entity
@Table(name = "Tree")
public class Tree { 


@Id
@Column(name="Tree_Id") 
@GeneratedValue(strategy = GenerationType.Identity)  
private Integer id;

@OneToMany(mappedBy = "parentTree", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Branch> branches;

//Getters And Setters

public Branch addBranch(Branch branch) {
getBranch().add(branch);

branch.setTree(this);

return branch;

}

// remove function to remove branches from tree 
}

Дочерний класс:

`@Entity
@Table(name = "Branch")
public class Branch {

@Id
@Column(name="Branch_Id") 
@GeneratedValue(strategy = GenerationType.Identity)
private Integer id;

@ManyToOne(fetch = FetchType.Lazy)
@JoinColumn(name = "TreeId")
private Tree parentTree;

@OneToMany(mappedBy = "parentBranch", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Leaf> leaves;

//Getters And Setters

public Leaf addLeaves(Leaf leaves) {
getLeaf().add(leaves);

leaves.setBranch(this);

return leaves;
}

// remove function for leaves to remove them from set
}`

Теперь при сохранении класса Tree через каскад все, что было добавлено или удалено из набора, будет обрабатываться соответствующим образом. Если дочерний объект является новым, а внешний ключ не заполняется перед сохранением, hibernate будет обрабатывать его на основе родительского PK.

Вот сущность, которая вызывает у меня проблемы:

@Entity
@Table(name = "Leaf")
public class Leaf {

@Id
@Column(name="Leaf_Id") 
@GeneratedValue(strategy = GenerationType.Identity)
private Integer id;

@ManyToOne(fetch = FetchType.Lazy)
@JoinColumn(name = "Branch_Id")
private Branch parentBranch;


// getters and setters

Проблема, с которой я сталкиваюсь, по меньшей мере неудобна, но когда нет записи для этого класса, hibernate сработает. и сохранить эту сущность с ключом родителей. Проблема, с которой я сталкиваюсь сейчас, заключается в том, существует ли запись Leaf для ребенка, когда я пытаюсь сохранить спящий режим, не назначает этому классу свой Внешний ключ. Это обычно происходит при обновлении. Странно, что hibernate сработает на вставке, а не на обновлении. Это работает для двух уровней, хотя, когда мы go от простого дерева к ветви. У кого-нибудь есть ответ на этот вопрос?

...