JPA中的树投射
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