Hibernate教程02——类继承(单表继承)

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();
}


七、 数据库的数据显示



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值