设为首页 加入收藏

TOP

Hibernate关系映射(一)
2015-07-24 10:24:06 来源: 作者: 【 】 浏览:3
Tags:Hibernate 关系 映射

六、继承映射

Single_Table

1、当多个类存在继承关系的时候,这时候建表的方案有3种。

2、第一种是父类中包含全部的属性,任何子类的信息都由父类对应的数据表来存储。在该表中,增加一个用于表示不同的子类及父类的字段,这样就可以对父类和子类数据进行区分。这种设计成为Single_Table。如下实验:

(1)设计一个父类Person.java。其中定义共有的属性id,name

package com.zgy.hibernate.model;

import javax.persistence.DiscriminatorColumn;

import javax.persistence.DiscriminatorType;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.Inheritance;

import javax.persistence.InheritanceType;

@Entity

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)

@DiscriminatorColumn(name="discriminator",discriminatorType=DiscriminatorType.STRING)

@DiscriminatorValue("person")

public class Person {

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;

}

}

(2)定义Student.java,定义自己的私有属性score

package com.zgy.hibernate.model;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

@Entity

@DiscriminatorValue("student")

public class Student extends Person{

private int score;

public int getScore() {

return score;

}

public void setScore(int score) {

this.score = score;

}

}

(3)定义Teacher.java,定义自己的私有属性title

package com.zgy.hibernate.model;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

@Entity

@DiscriminatorValue("teacher")

public class Teacher extends Person{

private String title;

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

}

(4)测试save()方法

package com.zgy.hibernate.model;

import java.util.Map;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

import org.hibernate.cfg.Configuration;

import org.hibernate.service.ServiceRegistry;

import org.hibernate.tool.hbm2ddl.SchemaExport;

import org.junit.AfterClass;

import org.junit.BeforeClass;

import org.junit.Test;

public class ORMapppingTest {

public static SessionFactory sf = null;

@BeforeClass

public static void beforeClass(){

Configuration configure =new Configuration().configure();

new SchemaExport(configure).create(true, true);

sf = configure.buildSessionFactory();

}

@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();

}

@AfterClass

public static void afterClass(){

sf.close();

}

}

(5)查看SQL语句:

create table Person (

discriminator varchar(31) not null,

id integer not null auto_increment,

name varchar(255),

score integer,

title varchar(255),

primary key (id)

)

Hibernate: insert into Person (name, score, discriminator) values (?, ?, 'student')

Hibernate: insert into Person (name, title, discriminator) values (?, ?, 'teacher')

可以看出,在Person表中,产生了所有子类的字段,并且在保存数据的时候,每条数据都加入了对应的标识。

@Inheritance(strategy=Inh

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇在rhel6上安装11.2.0.3or11.2.0.4.. 下一篇sequence的MAXVALUE、NOMAXVALUE..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python爬虫教程(从 (2025-12-26 16:49:14)
·【全269集】B站最详 (2025-12-26 16:49:11)
·Python爬虫详解:原 (2025-12-26 16:49:09)
·Spring Boot Java: (2025-12-26 16:20:19)
·Spring BootでHello (2025-12-26 16:20:15)