Hibernate使用注解,继承映射写法

本文详细介绍了Hibernate使用注解进行继承映射的三种策略:SINGLE_TABLE(单表策略),TABLE_PER_CLASS(每个类一张表)和JOINED(联合继承)。通过示例代码展示了如何在实体类中配置@Inheritance,@DiscriminatorColumn和@DiscriminatorValue等注解,并给出了每种策略对应的数据库表结构和数据存储方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继承映射在 Annotation 中使用 @Inheritance 注解,并且需要使用 strategy 属性指定继承策略,继承策略有 SINGLE_TABLE、TABLE_PER_CLASS 和 JOINED 三种。


一、SINGLE_TABLE

SINGLE_TABLE 是将父类和其所有的子类集合在一块,存在一张表中,并创建一个新的字段来判断对象的类型。

Person.java:

<div>
package com.getop.sales.model;

import javax.persistence.*;

/**
 * 
 * @ClassName: Person
 * @Description: 人类
 * @author LiYun
 * @date 2014-8-19 下午6:01:55
 * 
 */
@Entity
@Table(name = "SALES_PERSON")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "discriminator", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("person")
public class Person {

	private Integer id;
	private String name;

	@Id
	@Column(name = "id")
	@SequenceGenerator(name = "SALES_PERSON_ID", sequenceName = "SALES_PERSON_ID", allocationSize = 1, initialValue = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SALES_PERSON_ID")
	public Integer getId() {

		return id;
	}

	public void setId(Integer id) {

		this.id = id;
	}

	public String getName() {

		return name;
	}

	public void setName(String name) {

		this.name = name;
	}

}
</div>

@Inheritance 的 strategy 属性是指定继承关系的生成策略,@DiscriminatorColumn 注解作用是指定生成的新的判断对象类型的字段的名称和类型,@DiscriminatorValue 注解是确定此类(Person)的标示,即 DiscriminatorColumn 的值。

Student.java:

<div>
package com.getop.sales.model;

import javax.persistence.*;

@Entity
@DiscriminatorValue("student")
public class Student extends Person {

	private Integer score;

	public Integer getScore() {

		return score;
	}

	public void setScore(Integer score) {

		this.score = score;
	}

}
</div>

Teacher.java:

<div>
package com.getop.sales.model;

import javax.persistence.*;

@Entity
@DiscriminatorValue("teacher")
public class Teacher extends Person {

	private String title;

	public String getTitle() {

		return title;
	}

	public void setTitle(String title) {

		this.title = title;
	}

}
</div>

生成的数据库表如下:

image

存入数据后结构如下:

image


二、TABLE_PER_CLASS

TABLE_PER_CLASS 是为每一个类创建一个表,这些表是相互独立的。

Person.java:

<span class="lnum" style="color: rgb(96, 96, 96); ">   1:  </span>@Entity
   2:  @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
<span class="lnum" style="color: rgb(96, 96, 96); ">   3:  </span><span class="kwrd" style="color: rgb(0, 0, 255); ">public</span> <span class="kwrd" style="color: rgb(0, 0, 255); ">class</span> Person {
   4:      @Id
<span class="lnum" style="color: rgb(96, 96, 96); ">   5:  </span>    <span class="kwrd" style="color: rgb(0, 0, 255); ">private</span> <span class="kwrd" style="color: rgb(0, 0, 255); ">int</span> id;
   6:      private String name;
<span class="lnum" style="color: rgb(96, 96, 96); ">   7:  </span><span class="rem" style="color: rgb(0, 128, 0); ">//Getters and setters omitted here...</span>
   8:  }

Student.java:

<span class="lnum" style="color: rgb(96, 96, 96); ">   1:  </span>@Entity
   2:  public class Student extends Person{
<span class="lnum" style="color: rgb(96, 96, 96); ">   3:  </span>    <span class="kwrd" style="color: rgb(0, 0, 255); ">private</span> <span class="kwrd" style="color: rgb(0, 0, 255); ">int</span> score;
   4:  //Getters and setters omitted here...
<span class="lnum" style="color: rgb(96, 96, 96); ">   5:  </span>}

Teacher.java:

<span class="lnum" style="color: rgb(96, 96, 96); ">   1:  </span>@Entity
   2:  public class Teacher extends Person{
<span class="lnum" style="color: rgb(96, 96, 96); ">   3:  </span>    <span class="kwrd" style="color: rgb(0, 0, 255); ">private</span> String title;
   4:  //Getters and setters omitted here...
<span class="lnum" style="color: rgb(96, 96, 96); ">   5:  </span>}

创建的数据库表如下:

image

 


三、JOINED

JOINED 是将父类、子类分别存放在不同的表中,并且建立相应的外键,以确定相互之间的关系。

Person.java:

<span class="lnum" style="color: rgb(96, 96, 96); ">   1:  </span>@Entity
   2:  @Inheritance(strategy=InheritanceType.JOINED)
<span class="lnum" style="color: rgb(96, 96, 96); ">   3:  </span><span class="kwrd" style="color: rgb(0, 0, 255); ">public</span> <span class="kwrd" style="color: rgb(0, 0, 255); ">class</span> Person {
   4:      @Id
<span class="lnum" style="color: rgb(96, 96, 96); ">   5:  </span>    @GeneratedValue
   6:      private int id;
<span class="lnum" style="color: rgb(96, 96, 96); ">   7:  </span>    <span class="kwrd" style="color: rgb(0, 0, 255); ">private</span> String name;
   8:  //Getters and setters omitted here...
<span class="lnum" style="color: rgb(96, 96, 96); ">   9:  </span>}

子类中只需声明与父类不同的域即可:

Student.java:

<span class="lnum" style="color: rgb(96, 96, 96); ">   1:  </span>@Entity
   2:  public class Student extends Person{
<span class="lnum" style="color: rgb(96, 96, 96); ">   3:  </span>    <span class="kwrd" style="color: rgb(0, 0, 255); ">private</span> <span class="kwrd" style="color: rgb(0, 0, 255); ">int</span> coat;
   4:  //Getters and setters omitted here...
<span class="lnum" style="color: rgb(96, 96, 96); ">   5:  </span>}

Teacher.java 类似。

生成的数据库表如下:

JOINED

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值