Hibernate中有哪些继承映射策略?

Hibernate中有哪些继承映射策略?

有三种继承映射策略,分别是:

  • 按类层次结构生成一张表。

  • 按具体类生成一张表。

  • 按子类生成一张表。

本文将讨论按类层次结构生成一张表的映射策略。

阅读更多:MySQL 教程

按类层次结构生成一张表

  • 只生成一张表来进行继承映射。这种方法的缺点是表中会有很多空值。

  • 在该策略中使用的注释包括 @Inheritance(strategy=InheritanceType.SINGLE_TABLE)、@DiscriminatorColumn 和 @DiscriminatorValue。

  • 用于创建额外列的 @DiscriminatorColumn 用于识别继承类的类别。

考虑以下示例以理解该方法。

Hibernate中有哪些继承映射策略?

实现步骤如下:

  • 创建实体类并使用适当的注释。

  • 编写 Hibernate 配置文件并添加映射类。

  • 编写代码在表中创建和存储数据。

1.创建实体类

Car.java

package com.tutorialspoint;
@Entity
@Table(name = "car")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="category",discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue(value="car")
public class Car {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   private int id;

   @Column(name = "name")
   private String name;
   @Column(name = "color")
   private String color;
   //Getters
   //Setters
}

Sports_Car.java

package com.tutorialspoint;
import javax.persistence.*;
@Entity
@DiscriminatorValue("sportscar")
public class Sports_Car extends Car{
   @Column(name="mileage")
   private int mileage;

   @Column(name="cost")
   private int cost;
   //Getters
   //Setters
}

Taxi_Car.java

package com.tutorialspoint;
import javax.persistence.*;
@Entity
@DiscriminatorValue("taxi")
public class Taxi_Car extends Car{
   @Column(name="drivername")
   private String drivername;
   @Column(name="city")
   private String city;
   //Getters
   //Setters
}
包 com.tutorialspoint;
导入 javax.persistence.。 *;
@Entity
@DiscriminatorValue("taxicar")
公共的 类 Taxi_Car 扩展 Car{
   @Column(name="farePerKm")
   私有的 int farePerKm;

   @Column(name="available")
   私有的 boolean available;
   //Getters
   //Setters
}

2. Hibernate配置文件(hibernate.cfg.xml)

<!DOCTYPE hibernate-configuration PUBLIC
   "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
   "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
   <session-factory>
      <!-- JDBC 数据库连接设置 -->
      <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
      <property name="connection.url">jdbc:mysql://localhost:3306/demo?useSSL=false</property>
      <property name="connection.username">root</property>
      <property name="connection.password">root</property>
      <!-- 使用内置测试池的 JDBC 连接池设置 -->
      <property name="connection.pool_size">4</property>
      <!-- 将 SQL 输出到标准输出 -->
      <property name="show_sql">true</property>
      <!-- 选择我们的 SQL 方言 -->
      <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
      <!-- 启动时删除并重新创建数据库模式 -->
      <property name="hbm2ddl.auto">create-drop</property>
      <!-- 注释实体类的名称 -->
      <mapping class="com.tutorialspoint.Car"/>
      <mapping class="com.tutorialspoint.Sports_Car"/>
      <mapping class="com.tutorialspoint.Taxi_Car"/>
   </session-factory>
</hibernate-configuration>

3. 用于创建表并存储数据的代码

包 com.tutorialspoint;
导入 org.hibernate.会话;
导入 org.hibernate.SessionFactory;
导入 org.hibernate.交易;
导入 org.hibernate.cfg.配置;

公开的 类 StoreTest {
   公开静态的 void main(字符串 args[]){
      SessionFactory sessionFactory = 新的 Configuration()
         .configure("com/tutorialspoint/hibernate.cfg.xml")
         .buildSessionFactory();
      会话 session=sessionFactory.openSession();
      交易 t=session.beginTransaction();
      汽车 c1=新的 汽车();
      c1.setName("梅赛德斯");
      c1.setColor("黑色");

      Sport_Car c2=新的 Sport_Car();
      c2.setName("保时捷");
      c2.setColor("红色");
      c2.setMileage(20);
      c2.setCost(5000000);

      Taxi_Car c3=新的 Taxi_Car();
      c3.setName("英诺瓦");
      c3.setColor("白色");
      c3.setFarePerKm(7);
      c3.setAvailable(真);
      session.persist(c1);
      session.persist(c2);
      session.persist(c3);

      t.commit();
      session.close();
   }
}

MySQL表

Hibernate中有哪些继承映射策略?

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程