package org.hibernate.examples.mapping.tree;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.*;
import org.hibernate.examples.model.AbstractHibernateEntity;
import org.hibernate.examples.model.HibernateTreeEntity;
import org.hibernate.examples.model.TreeNodePosition;
import org.hibernate.examples.utils.HashTool;
import org.hibernate.examples.utils.ToStringHelper;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.*;
import java.util.LinkedHashSet;
import java.util.Set;
/**
* org.hibernate.examples.mapping.tree.TreeNode
*
* @author 배성혁 sunghyouk.bae@gmail.com
* @since 2013. 12. 3. 오후 6:42
*/
@Entity
@org.hibernate.annotations.Cache(region = "example", usage = CacheConcurrencyStrategy.READ_WRITE)
@DynamicInsert
@DynamicUpdate
@Getter
@Setter
public class TreeNode extends AbstractHibernateEntity<Long> implements HibernateTreeEntity<TreeNode> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter(AccessLevel.PROTECTED)
private Long id;
private String title;
private String data;
private String description;
/**
* 부모 노드
*/
@ManyToOne(fetch = FetchType.LAZY)
@LazyToOne(LazyToOneOption.PROXY)
@JoinColumn(name = "ParentId")
private TreeNode parent;
/**
* 자식 노드
* mappedBy를 정의하여, child 마다 관리되도록 해야합니다.
*/
@OneToMany(mappedBy = "parent", cascade = {CascadeType.ALL}, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.EXTRA)
private Set<TreeNode> children = new LinkedHashSet<TreeNode>();
/**
* 노드의 TreeView 상에서의 위치
*/
TreeNodePosition nodePosition = new TreeNodePosition();
/**
* 자식 노드를 추가합니다.
*/
@Override
public void addChild(TreeNode child) {
child.setParent(this);
children.add(child);
}
/**
* 자식 노드를 삭제합니다.
*/
@Override
public void removeChild(TreeNode child) {
if (children.contains(child)) {
children.remove(child);
child.setParent(null);
}
}
@Override
public int hashCode() {
return HashTool.compute(title);
}
@Override
public ToStringHelper buildStringHelper() {
return super.buildStringHelper()
.add("id", id)
.add("title", title)
.add("description", description);
}
private static final long serialVersionUID = 6573065680420748563L;
}