📜  Hibernate – 使用 XML 文件的每个子类的表示例(1)

📅  最后修改于: 2023-12-03 15:01:08.213000             🧑  作者: Mango

Hibernate – 使用 XML 文件的每个子类的表示例

在Hibernate中,每个实体类都必须映射到数据库中的一张表。对于一个类的继承关系,可以使用Hibernate提供的继承策略来实现映射。其中之一是每个子类映射到单独的表中。

XML文件介绍

在使用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类,它具有两个子类:EmployeeManagerEmployeeManager都有一些自己特有的属性,而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>元素将一个继承结构映射到数据库表是一种很好的方式,它可以让你在查询时轻松地按类型筛选数据。