`

JPA中的树映射

阅读更多

 

这是某个游戏引擎的技能树,比较简单,算是心得吧。先记下再说。

 

废话不说上代码,注解有问题可以搜搜。

package com.xxx.ge.skill.model;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import com.xxx.common.BaseEntity;

/**
 * 技能树
 * 
 * @author ZhangPeng
 * 
 */
@SuppressWarnings("serial")
@Entity
@Table(name = "s_skill_tree", schema = "ge")
public class SkillTree extends BaseEntity {

	private SkillTree parent; // 必要技能(父节点)

	private List<SkillTree> children; // 衍生技能(子节点)

	private Skill skill; // 技能

	private Integer level; // 必要等级

	public SkillTree() {
	}

	public SkillTree(SkillTree parent) {
		setData(parent, null);
	}

	public SkillTree(SkillTree parent, List<SkillTree> children) {
		setData(parent, children);
	}

	@ManyToOne
	@JoinColumn(name = "parent_id", nullable = true)
	public SkillTree getParent() {
		return parent;
	}

	public void setParent(SkillTree parent) {
		this.parent = parent;
	}

	@OneToMany(mappedBy = "parent", fetch = FetchType.EAGER)
	@JoinColumn(name="parent_id")
	public List<SkillTree> getChildren() {
		return children;
	}

	public void setChildren(List<SkillTree> children) {
		this.children = children;
	}

	@ManyToOne
	@JoinColumn(name = "skill_id", nullable = false)
	public Skill getSkill() {
		return skill;
	}

	public void setSkill(Skill skill) {
		this.skill = skill;
	}

	@Column(name = "level", scale = 10)
	public Integer getLevel() {
		return level;
	}

	public void setLevel(Integer level) {
		this.level = level;
	}

	@Transient
	public boolean isRoot() {
		return (this.parent == null);
	}

	@Transient
	public boolean isLeaf() {
		return (this.children == null);
	}

	private void setData(SkillTree parent, List<SkillTree> children) {
		this.parent = parent;
		this.children = children;
	}
}

 

 生出来的DDL:

 

-- Table "s_skill_tree" DDL

CREATE TABLE `s_skill_tree` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `level` int(11) DEFAULT NULL,
  `skill_id` bigint(20) NOT NULL,
  `parent_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FK157CCC18A344D99E` (`skill_id`),
  KEY `FK157CCC183AF245E3` (`parent_id`),
  CONSTRAINT `FK157CCC183AF245E3` FOREIGN KEY (`parent_id`) REFERENCES `s_skill_tree` (`id`),
  CONSTRAINT `FK157CCC18A344D99E` FOREIGN KEY (`skill_id`) REFERENCES `s_skill` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

 

本打算做成英雄无敌五里面的那个技能轮来了,不过是在懒得想,再说自己毕竟不是设计人员哈。先凑合了。

 

分享到:
评论
1 楼 yawei 2010-11-29  
good example. thanks

相关推荐

Global site tag (gtag.js) - Google Analytics