Hibernate继承策略

简介:         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")指明子类表相对于父类表外键的名称。

目录
相关文章
|
3月前
|
缓存 NoSQL Java
揭秘性能提升的超级武器:掌握Hibernate二级缓存策略!
【9月更文挑战第3天】在软件开发中,性能优化至关重要。使用Hibernate进行数据持久化的应用可通过二级缓存提升数据访问速度。一级缓存随Session生命周期变化,而二级缓存是SessionFactory级别的全局缓存,能显著减少数据库访问次数,提高性能。要启用二级缓存,需在映射文件或实体类上添加相应配置。然而,并非所有场景都适合使用二级缓存,需根据业务需求和数据变更频率决定。此外,还可与EhCache、Redis等第三方缓存集成,进一步增强缓存效果。合理运用二级缓存策略,有助于大幅提升应用性能。
98 5
|
4月前
|
缓存 Java 数据库连接
Hibernate 中的获取策略有哪些?
【8月更文挑战第21天】
24 0
|
5月前
|
SQL 缓存 Java
使用Hibernate实现复杂数据库查询优化策略
使用Hibernate实现复杂数据库查询优化策略
|
5月前
|
SQL 缓存 Java
使用Hibernate实现复杂数据库查询优化策略
使用Hibernate实现复杂数据库查询优化策略
|
6月前
|
缓存 Java 数据库连接
构建高效数据库交互:Hibernate与JPA的性能优化策略
【6月更文挑战第25天】在大数据时代,优化Hibernate和JPA的数据库性能至关重要。本文探讨了优化策略:正确配置映射以减少冗余,利用JPQL/HQL提升查询效率,避免全字段选择,使用索引和分页,有效利用缓存策略,以及管理事务以平衡资源锁定。示例代码展示了分页查询的实现,以防止性能下降。
132 0
|
7月前
|
Java 数据库连接 数据库
Hibernate5中实体映射命名策略
Hibernate5中实体映射命名策略
142 0
|
7月前
|
SQL 缓存 Java
Hibernate - 检索策略入门与详解
Hibernate - 检索策略入门与详解
60 0
|
7月前
|
SQL 存储 Java
Hibernate - 继承关联关系映射
Hibernate - 继承关联关系映射
75 0
|
XML Java 数据库连接
《Hibernate上课笔记》----class4----Hibernate继承关系映射实现详解
《Hibernate上课笔记》----class4----Hibernate继承关系映射实现详解
98 0
《Hibernate上课笔记》----class4----Hibernate继承关系映射实现详解
|
SQL Java 数据库连接
《Hibernate上课笔记》-----class8----Hibernate的检索方式和检索策略
《Hibernate上课笔记》-----class8----Hibernate的检索方式和检索策略
112 0
《Hibernate上课笔记》-----class8----Hibernate的检索方式和检索策略