eritanceType.SINGLE_TABLE)用于定义存储的策略使用的是单表存储
@DiscriminatorColumn(name="discriminator",discriminatorType=DiscriminatorType.STRING)定义标识列,该列的类型是String类型
@DiscriminatorValue("person")定义Person类的数据在标识列discriminator中的取值是“person”
@DiscriminatorValue("student")定义Student类的数据对应的表示是“student”
@DiscriminatorValue("teacher")定义Teacher类的数据对应的表示是“teacher”
测试读取数据:
@Test
public void testLoad() {
testSave();
Session session = sf.openSession();
session.beginTransaction();
Student s = (Student)session.load(Student.class, 1);
Person t = (Person)session.load(Person.class, 2);
System.out.println(s.getScore());
System.out.println(t.getName());
session.getTransaction().commit();
session.close();
}
查看SQL语句:
Hibernate: select student0_.id as id2_0_0_, student0_.name as name3_0_0_, student0_.score as score4_0_0_ from Person student0_ where student0_.id=? and student0_.discriminator='student'
80
Hibernate: select person0_.id as id2_0_0_, person0_.name as name3_0_0_, person0_.score as score4_0_0_, person0_.title as title5_0_0_, person0_.discriminator as discrimi1_0_0_ from Person person0_ where person0_.id=?
t1
Table_Per_Class
(1)修改Person.java中的ID生成策略,使用Table生成主键
package com.zgy.hibernate.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.TableGenerator;
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@TableGenerator(
name="t_gen",
table="t_gen_table",
pkColumnName="t_pk",
valueColumnName="t_value",
pkColumnValue="person_pk",
initialValue=1,
allocationSize=1
)
public class Person {
private int id;
private String name;
@Id
@GeneratedValue(generator="t_gen",strategy=GenerationType.TABLE)
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;
}
}
(2)修改Student.java
package com.zgy.hibernate.model;
import javax.persistence.Entity;
@Entity
public class Student extends Person{
private int score;
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
(3)修改Teacher.java
package com.zgy.hibernate.model;
import javax.persistence.Entity;
@Entity
public class Teacher extends Person{
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
(4)测试save()方法
@Test
public void testSave() {
Student s = new Student();
s.setName("s1");
s.setScore(80);
Teacher t = new Teacher();
t.setName("t1");
t.setTitle("中级");
Session session = sf.openSession();
session.beginTransaction();
session.save(s);
session.save(t);
session.getTransaction().commit();
session.close();
}
(5)观察生成的SQL语句
create table Person (
id integer not null,
name varchar(255),
primary key (id)
)
create table Student (
id integer not null,
name varchar(255),
score integer not null,
primary key (id)
)
create table Teacher (
id integer not null,
name varchar(255),
title varchar(255),
primary key (id)
)
create table t_gen_table (
t_pk varchar(25