有三种类型的继承映射策略 -

  • 每个类层次结构的表
  • 每个混凝土等级的桌子
  • 每个子类的表
    在本文中,我们将讨论每个类层次结构的表。

每个类层次结构的表

  • 在此中,仅为继承映射创建一个表。此方法的缺点是表中存储了许多空值。
  • @Inheritance(策略=InheritanceType.SINGLE_TABLE)、@DiscriminatorColumn和@DiscriminatorValue是此策略中使用的注释。
  • @DiscriminatorColumn用于创建用于标识层次结构类的附加列。

考虑以下示例来理解这一点 -

Hibernate 中有哪些可用的继承映射策略?_java

实施步骤 -

  • 创建实体类并为其使用适当的批注。
  • 编写休眠配置文件并添加映射类。
  • 编写代码以在表中创建和存储数据。

1.创建实体类

车.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
(
"taxicar"
)
public
class
Taxi_Car
extends
Car
{
@Column
(name
=
"farePerKm"
)
private
int farePerKm
;
@Column
(name
=
"available"
)
private
boolean available
;
//Getters
//Setters
}


2. 休眠配置文件(休眠.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 Database connection settings -->
<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 connection pool settings ... using built-in test pool -->
<property name="connection.pool_size">4
</property>
<!-- Echo the SQL to stdout -->
<property name="show_sql">true
</property>
<!-- Select our SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect
</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create-drop
</property>
<!-- name of annotated entity class -->
<mapping class="com.tutorialspoint.Car"/>
<mapping class="com.tutorialspoint.Sports_Car"/>
<mapping class="com.tutorialspoint.Taxi_Car"/>
</session-factory>
</hibernate-configuration>


3. 创建表和存储数据的代码


package com
.tutorialspoint
;
import org
.hibernate
.
Session
;
import org
.hibernate
.
SessionFactory
;
import org
.hibernate
.
Transaction
;
import org
.hibernate
.cfg
.
Configuration
;
public
class
StoreTest
{
public
static
void
main
(
String args
[
]
)
{
SessionFactory sessionFactory
=
new
Configuration
(
)
.
configure
(
"com/tutorialspoint/hibernate.cfg.xml"
)
.
buildSessionFactory
(
)
;
Session session
=sessionFactory
.
openSession
(
)
;
Transaction t
=session
.
beginTransaction
(
)
;
Car c1
=
new
Car
(
)
; c1
.
setName
(
"Mercedes"
)
; c1
.
setColor
(
"Black"
)
;
Sport_Car c2
=
new
Sport_Car
(
)
; c2
.
setName
(
"Porsche"
)
; c2
.
setColor
(
"Red"
)
; c2
.
setMileage
(
20
)
; c2
.
setCost
(
5000000
)
;
Taxi_Car c3
=
new
Taxi_Car
(
)
; c3
.
setName
(
"Innova"
)
; c3
.
setColor
(
"White"
)
; c3
.
setFarePerKm
(
7
)
; c3
.
setAvailable
(
true
)
; session
.
persist
(c1
)
; session
.
persist
(c2
)
; session
.
persist
(c3
)
; t
.
commit
(
)
; session
.
close
(
)
;
}
}


MySQL 表

Hibernate 中有哪些可用的继承映射策略?_mysql_02