У меня проблема с отображением сущности 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 от простого дерева к ветви. У кого-нибудь есть ответ на этот вопрос?