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

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 中,为了处理对象模型中的继承关系,提供了以下几种继承策略: 1. **单表继承(Single Table Inheritance)**:所有子类共享同一张数据库表,使用一个标识字段来区分不同的...

    Hibernate继承映射(annotation)

    ### Hibernate继承策略 Hibernate支持多种继承映射策略,包括: 1. **单表继承(Single Table Inheritance)**:所有的子类信息存储在同一个表中,通过一个特定的字段来区分不同的子类。 2. **类表继承(Class ...

    Hibernate继承映射代码

    Hibernate提供了四种继承策略:单表继承(Single Table Inheritance)、联合继承( Joined Table Inheritance)、表 per 类继承(Table per Class Inheritance)以及分层继承(Concrete Table Inheritance)。...

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

    本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承策略。 ### 单一表继承策略 在单一表继承策略中,所有类层次结构中的实例都存储在同一张数据库表中。这种策略通过在表中...

    jpa/hibernate继承注解

    以下是对"jpa/hibernate继承注解"这一主题的详细说明。 1. **单一表继承(Single Table Inheritance, STI)** 单一表继承是最简单的继承策略,所有的子类信息都存储在一个数据库表中。使用`@Inheritance(strategy ...

    用Hibernate映射继承关系

    Hibernate支持多种继承策略,包括单一表继承(Single Table Inheritance)、联合表继承( Joined Table Inheritance)和表-per类继承(Table per Class Inheritance)。每种策略都有其特定的适用场景和优缺点,下面...

    hibernate继承映射.rar

    《Hibernate继承映射详解》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。在实际项目中,我们常常会遇到类的继承关系,而Hibernate提供了强大的支持来处理这种继承关系的...

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

    本篇文章将详细探讨Hibernate继承映射的策略,特别是“每个具体类一张表”(Table Per Concrete Class)的映射方式。 在面向对象编程中,继承是常见的代码复用手段,但在关系型数据库中,这种概念并不直接对应。...

    Hibernate继承关系映射.pdf

    标题:“Hibernate继承关系映射.pdf” 描述:“简明扼要地介绍了Hibernate中继承关系的映射方式,深入探讨了三种不同的映射策略及其优缺点,同时解析了多态查询的概念。” 知识点: ### Hibernate继承关系映射...

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

    本文将详细探讨“Hibernate继承映射的第一种策略:每个类对应一张表”的概念、实现方式以及其优缺点。 首先,我们需要理解Hibernate继承映射的基本策略。在面向对象编程中,类继承是常见的代码复用手段,但在数据库...

    Hibernate继承映射-概述

    《Hibernate继承映射详解》 在Java开发中,对象关系映射(ORM)框架如...根据项目需求选择合适的继承策略,可以优化数据存储,提升系统性能。同时,结合源码学习,能更深入地理解其工作原理,为实际开发提供强大支持。

    Hibernate继承映射二:每个子类一张表

    这种方式也被称为单表继承或多表继承,是Hibernate支持的四种继承映射策略之一。了解并熟练掌握这种映射模式对于提升Java开发效率和代码维护性至关重要。 在传统的面向对象编程中,类可以有继承关系,但在关系...

    (2)Hibernate3.2 中的类继承关系

    在Hibernate中配置类继承关系,我们需要在实体类上使用`@Inheritance`注解,并指定继承策略。例如,使用单表继承: ```java @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn...

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

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

Global site tag (gtag.js) - Google Analytics