`
234390216
  • 浏览: 10194045 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460812
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1771850
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395469
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393909
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678239
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529311
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178754
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:461973
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150157
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66872
社区版块
存档分类
最新评论

Hibernate继承策略

阅读更多

        Hibernate继承策略总共有三种,一种是共用一张表;一种是每个类一张表,表里面储存子类的信息和父类的信息;还有一种是通过表连接的方式,每个类都有一张表,但是子类对应的表只保存自己的信息,父类对应的表保存父类的信息,它们之间通过子类表和父类表的关联来获取所有的信息。

第一种方式,即共用一张表:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="discriminator", discriminatorType=DiscriminatorType.STRING)//表示区分不同的对象的字段名
@DiscriminatorValue("person")//用来表示该对象是何种对象的,即区分器
public class Parent {
	private int id;
	private String name;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

}

@Entity
@DiscriminatorValue("child1")
public class Child1 extends Parent {
	private String email;

	public String getEmail() {
		return title;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	
}



@Entity
@DiscriminatorValue("child2")
public class Child2 extends Parent {
	
	private String address;

	public String getAddress() {
		return score;
	}

	public void setAddress(String address) {
		this.address = address;
	}
	
} 

        这种情况父类和所有子类的所有信息都保存在同一张表里面,通过我们指定的@DiscriminatorColumn对应的@DiscriminatorValue来区别不同的类。 当没有指定@DiscriminatorValue的时候将使用全类名来作为DiscriminatorValue。

 

 

第二种策略是每个类一张表,保存所有信息:

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@TableGenerator(		//一个类一张表,最重要的是要保证它们的id由一个生成器产生,@TableGenerator就是为了控制这个的
		name="t_gen",
		table="t_gen_table",
		pkColumnName="t_pk",
		valueColumnName="t_value",
		pkColumnValue="person_pk",
		initialValue=1,
		allocationSize=1
		)
public class Parent {
	private int id;
	private String name;
	
	@Id
	@GeneratedValue(generator="t_gen", strategy=GenerationType.TABLE)//这个就是用表生成器生成的,用同一个生成器就可以控制它们的id不重复
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

}


@Entity
public class Child2 extends Parent {
	
	private String address;

	public String getAddress() {
		return score;
	}

	public void setAddress(String address) {
		this.address = address;
	}
	
}


@Entity
public class Child1 extends Parent {
	private String email;

	public String getEmail() {
		return title;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	
}

 

 

弟三种方式是采用表连接的方式:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)

public class Parent {
	private int id;
	private String name;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

}

@Entity
public class Child2 extends Parent {
	
	private String address;

	public String getAddress() {
		return score;
	}

	public void setAddress(String address) {
		this.address = address;
	}
	
}


@Entity
public class Child1 extends Parent {
	private String email;

	public String getEmail() {
		return title;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	
}

         采用表连接的情况,还是每个类拥有自己的一张表,只是子类对应的表只保存子类的信息,其父类的信息由父类的表保存。当需要获取子类的完整信息时通过表连接的方式连接子类的表和父类的表获取对应信息。可以在子类的表上标注@PrimaryKeyJoinColumn(name="foreignKeyName")指明子类表相对于父类表外键的名称。

1
3
分享到:
评论

相关推荐

    Hibernate案例与专题-继承映射策略

    Hibernate案例与专题-继承映射策略。详细介绍了Hibernate继承映射策略。

    Hibernate继承映射的第一种策略:每棵类继承树对应一张表

    博文链接:https://shaqiang32.iteye.com/blog/201319

    Hibernate数据关联映射与继承策略

    Hibernate数据关联映射与继承策略.rar

    Hibernate实体对象继承的三种方法

     hibernate继承策略总共有三种,一种是共用一张表;一种是每个类一张表,表里面储存子类的信息和父类的信息;还有一种是通过表连接的方式,每个类都有一张表,但是子类对应的表只保存自己的信息,父类对应的表保存...

    Hibernate继承映射的第一种策略:每个具体类一张表

    博文链接:https://shaqiang32.iteye.com/blog/201321

    Hibernate继承映射的第一种策略:每个类对应一张表

    博文链接:https://shaqiang32.iteye.com/blog/201320

    彻底解决hibernate常见难点.zip

    Hibernate处理1-N关系时保存技巧、Hibernate缓存机制、Hibernate批量处理数据、Hibernate三种继承映射策略、hibernate映射体系、Hibernate主键生成策略、持久层DAO设计建议、基于xml文件的bean、使用HibernateAPI在...

    Hibernate学习笔记

    001 Hibernate 简介(开源 O/R 映射框架) 002 第一个 Hibernate 示例 003 hibernate 主要接口介绍 004 持久对象的生命周期介绍 005 query 接口初步 006 开源 O/R 映射框架内容回顾 ...029 hibernate 抓取策略

    Hibernate+中文文档

    3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. 别名注射(alias injection names) 19.1. ...

    hibernate3.2中文文档(chm格式)

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    HibernateAPI中文版.chm

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    hibernate学习笔记

    Hibernate 学习笔记 Hibernate 学习笔记 1 第一个hibernate项目(hibernate_first) 2 测试实体对象的生命周期(hibernate_session) 3 ...hibernate抓取策略 53 Hibernate最佳实践(Best Practices) 55

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     5.1.2 Hibernate访问持久化类属性的策略  5.1.3 在持久化类的访问方法中加入程序逻辑  5.1.4 设置派生属性  5.1.5 控制insert和update语句  5.2 处理SQL引用标识符  5.3 创建命名策略  5.4 设置数据库Schema...

    Hibernate 课件及源代码

    内容涵盖安装 Hibernatetools 插件、Session 核心方法、持久化对象生命周期、对象关系映射(1-n、1-1、n-n、继承映射)、检索策略、检索方式(对象导航图、OID 检索、HQL、QBC、本地SQL)、Hibernate 一\二级缓存、...

Global site tag (gtag.js) - Google Analytics