Hibernate教程02——类继承(单表继承)
一、简介
单表继承,每棵类继承树使用一张表(所有的类使用一个表)
父类(Animal)和子类(Pig、Bird)只生成一张表,该表中包括了父类和子类的所有属性,
因为类继承树肯定是对应多个类,要把多个类的信息存放在一张表中,必须有某种机制来区分哪些记录是属于哪个类的。这种机制就是,在表中添加一个字段,用这个字段的值来进行区分。
关于鉴别值(Type)在存储的时候hibernate会自动存储,在加载的时候会根据鉴别值取得相关的对象
t_animal
Id | Name | Sex | Weight | Height | Type |
1 | 小猪 | True | 200 |
| P |
2 | 小鸟 | False |
| 50 | B |
二、Annotation介绍
@Entity
//声明类继承使用整个类层次使用一张表实现
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
//区分不同类的标识符在数据库中的列描述(名称、类型、长度)
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING, length = 30)
//区分不同类的标识符
@DiscriminatorValue("Tree")
三、建立父类Tree(使用和上面不一样的类进行举例)
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING, length = 30)
@DiscriminatorValue("Tree")
public class Tree {
@Id
@GeneratedValue
@Column(name = "id")
private Long id;
private String name;
private String description;
@ManyToOne
private Tree parent;
@OneToMany
private List<Tree> children;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Tree getParent() {
return parent;
}
public void setParent(Tree parent) {
this.parent = parent;
}
public List<Tree> getChildren() {
return children;
}
public void setChildren(List<Tree> children) {
this.children = children;
}
}
四、建立子类Department
@Entity
@DiscriminatorValue("Department")
public class Department extends Tree {
private String leader;
private String secondLeader;
private String link;
private String remarkk;
public String getLeader() {
return leader;
}
public void setLeader(String leader) {
this.leader = leader;
}
public String getSecondLeader() {
return secondLeader;
}
public void setSecondLeader(String secondLeader) {
this.secondLeader = secondLeader;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getRemarkk() {
return remarkk;
}
public void setRemarkk(String remarkk) {
this.remarkk = remarkk;
}
五、建立子类menu
@Entity
@DiscriminatorValue("Menu")
public class Menu extends Tree {
private String link;
private String classname;
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
}
六、建立测试类
@Test
public void test02(){
Session session = HibernateUtil.getSessionfactory().getCurrentSession();
session.beginTransaction();
Department tree = new Department();
tree.setName("信息中心");
tree.setDescription("信息中心");
tree.setLeader("刘备");
session.save(tree);
Department tree2 = new Department();
tree2.setName("软件二室");
tree2.setDescription("软件二室");
tree2.setLeader("张飞");
tree2.setParent(tree);
session.save(tree2);
tree2 = new Department();
tree2.setName("软件二室");
tree2.setDescription("软件二室");
tree2.setLeader("关羽");
tree2.setParent(tree);
session.save(tree2);
tree2 = new Department();
tree2.setName("软件二室");
tree2.setDescription("软件二室");
tree2.setLeader("赵云");
tree2.setParent(tree);
session.save(tree2);
session.getTransaction().commit();
HibernateUtil.getSessionfactory().close();
}
@Test
public void test03(){
Session session = HibernateUtil.getSessionfactory().getCurrentSession();
session.beginTransaction();
Menu tree = new Menu();
tree.setName("系统管理");
tree.setDescription("系统配置的一些管理");
tree.setLink("sys/admin");
session.save(tree);
Menu tree2 = new Menu();
tree2.setName("用户管理");
tree2.setDescription("用户配置的一些管理");
tree2.setLink("sys/user");
tree2.setParent(tree);
session.save(tree2);
tree2 = new Menu();
tree2.setName("角色管理");
tree2.setDescription("角色配置的一些管理");
tree2.setLink("sys/role");
tree2.setParent(tree);
session.save(tree2);
session.getTransaction().commit();
HibernateUtil.getSessionfactory().close();
}
七、 数据库的数据显示