美文网首页
hibernate继承关系映射的JPA方式实现 ——单表继承

hibernate继承关系映射的JPA方式实现 ——单表继承

作者: 我我我我我_a70b | 来源:发表于2019-05-06 21:33 被阅读0次

基础配置

persistence.xml
首先应在src目录中新建META-INF文件夹,将persistence.xml文件放入
persistence.xml内容

首先来讲一下单表继承
假设这里有三个实体类
            person
        |           |
      teacher        student
person俩属性 id 和name
teacher多出一个属性 tittle(职称) student多出一个属性score(分数)
那么在数据库中用表怎么表示这种继承关系呢
一种办法是 一个表中包含所有字段
根据特有字段值生成特定子类
为了方便判断子类类型 增加一个类型字段 指定对象类型

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="JPA" transaction-type="RESOURCE_LOCAL">
        <!-- 这里指明实现jpa的类 不同版本hibernate位置不同 这里是2.5.8 -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!-- 添加对应的持久化类 -->
        <class>entity.Person</class>
        <class>entity.Student</class>
        <class>entity.Teacher</class>
        <properties>
            <!-- jpa中连接数据库 -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hb_db?serverTimezone=GMT%2B8" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="admin"></property>

            <!-- jpa中配置hibernate基本属性 -->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>

    </persistence-unit>
</persistence>

另外自己xml方式配置太多,老想继续配置hibernate.cfg.xml
其实从上面persistence.xml需要配置数据库属性就会发现二者是相同的作用的 所以这里hibernate.cfg.xml并不需要再做配置,没要也无妨。

single_table

实体类

Person.java

package entity;

import javax.persistence.*;

@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(strategy = GenerationType.IDENTITY)
    
    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
表示持久化的实体类
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
指定继承类型为单表继承
@DiscriminatorColumn(name="discriminator",discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("person")

Teacher.java

package entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

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

    private String tittle;

    public String getTittle() {
        return tittle;
    }

    public void setTittle(String tittle) {
        this.tittle = tittle;
    }
}

Student.java

package entity;

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;
    }
}

测试类

package test.entity;


import entity.Person;
import entity.Student;
import entity.Teacher;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

import static javax.persistence.Persistence.*;

public class hibernateExTest {

    public static  void main(String args[]){
        EntityManagerFactory factory = createEntityManagerFactory("JPA");
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();


        Person p =new Person();
        p.setName("温丛晓");

        Teacher t = new Teacher();
        t.setTittle("高级");
        t.setName("t1");

        Student s = new Student();
        s.setScore(100);
        s.setName("s1");


        em.persist(p);
        em.persist(t);
        em.persist(s);

        em.getTransaction().commit();
        em.close();
        factory.close();


    }
}

相关文章

网友评论

      本文标题:hibernate继承关系映射的JPA方式实现 ——单表继承

      本文链接:https://www.haomeiwen.com/subject/hpkjoqtx.html