📅  最后修改于: 2023-12-03 15:01:08.213000             🧑  作者: Mango
在Hibernate中,每个实体类都必须映射到数据库中的一张表。对于一个类的继承关系,可以使用Hibernate提供的继承策略来实现映射。其中之一是每个子类映射到单独的表中。
在使用XML文件配置映射时,我们需要在映射文件中声明继承策略。这个策略就是使用<subclass>
元素来声明,它包含了子类的信息和所映射的表名。
下面是一个标准映射文件的模板。其中<subclass>
元素出现在<class>
元素内部:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="<YourClassName>" table="<YourTableName>">
<subclass name="<YourSubClassName>" discriminator-value="<YourDiscriminatorValue>" />
...
</class>
</hibernate-mapping>
其中,
<YourClassName>
:你要映射的对象类名。<YourTableName>
:你要映射的表名。<YourSubClassName>
:你要表示的子类。该元素必须包含一个name
属性,该属性指定了该子类的完整类名。<YourDiscriminatorValue>
:鉴别器值,该值唯一标识了该子类。该元素必须包含一个discriminator-value
属性,该属性 用于指定鉴别器值。下面是一个示例用法。这里我们有一个Person
类,它具有两个子类:Employee
和Manager
。Employee
和Manager
都有一些自己特有的属性,而Person
没有。
@Entity
@DiscriminatorValue("P")
@Table(name = "persons")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
private int age;
// getters and setters
}
@Entity
@DiscriminatorValue("E")
public class Employee extends Person {
private String company;
private String title;
// getters and setters
}
@Entity
@DiscriminatorValue("M")
public class Manager extends Person {
private String department;
private BigDecimal salary;
// getters and setters
}
在XML文件中,我们可以这样表示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.example.Person" table="PERSONS">
<id column="id" type="long" />
<discriminator column="PERSON_TYPE" type="string" />
<subclass name="com.example.Employee" discriminator-value="E">
<property name="company" />
<property name="title" />
</subclass>
<subclass name="com.example.Manager" discriminator-value="M">
<property name="department" />
<property name="salary" />
</subclass>
</class>
</hibernate-mapping>
在这个例子中,我们设置了鉴别器列的列名为PERSON_TYPE
,类型为字符串类型。同时我们将Employee
的鉴别器值设置为E
,将Manager的鉴别器值设置为M
。
继承策略是Hibernate映射中的一个重要方面。使用<subclass>
元素将一个继承结构映射到数据库表是一种很好的方式,它可以让你在查询时轻松地按类型筛选数据。