📜  Hibernate – 使用注解的每个子类的表

📅  最后修改于: 2022-05-13 01:55:38.627000             🧑  作者: Mango

Hibernate – 使用注解的每个子类的表

Hibernate是一个开源的、非侵入性的、轻量级的Java ORM(对象关系映射)框架,用于开发独立于数据库软件的持久性逻辑。 ORM(对象关系映射)框架简化了数据创建、数据操作和数据访问。它是一种将对象映射到存储在数据库中的数据的编程技术。它在内部使用JDBC API与数据库进行交互。

Hibernate 中的继承

当对象保存在数据库中时, Hibernate可以将对象的继承属性及其新属性存储在其数据库中。在Hibernate中,当一个模块的多个POJO类包含一些公共属性时,会应用POJO类之间的继承。在实时应用中, HibernatePOJO类是基于数据库表设计的。

如果一个以上的POJO类具有一些公共属性,那么这些公共属性将被分离到一个称为基类的POJO类中,不常见的属性存储在派生类中。这就是Hibernate继承机制的概念。 Hibernate 能够根据数据库设计将应用程序的类层次结构的数据存储到数据库的一个表或数据库的多个表中。

Hibernate 继承映射

面向对象可以对“是一个”“有一个”关系进行建模。关系模型仅支持两个实体之间“有关系”Hibernate有助于将此类对象与关系表进行映射。 Hibernate中定义了三种继承映射策略。

  • 每个层次结构的表
  • 每个混凝土类的表
  • 每个子类的表

每个子类的表

在每个子类策略的表中 (使用 XML 文件)

  1. 对于层次结构的每个类,数据库中都存在一个单独的表。
  2. 表是根据持久类创建的,但使用主键和外键处理它们,因此关系中不会有任何重复的列。
  3. 在创建数据库表时,需要父表和子表之间有外键关系。
  4. 要将信息传递给Hibernate应用每个子类映射的表,我们必须在hbm.xml文件的标记下配置标记
  5. 鉴别器列是可选的

在每个子类策略的表中(使用注释)

  1. 鉴别器是可选的,因此我们可以避免与鉴别器相关的注释。
  2. 我们需要为基类和每个派生类创建一个单独的表。
  3. 为了获得基类表和派生类表之间的关系,我们在派生类表中使用外键
  4. 派生类表中的外键列也可以用作该派生类表的主键列,以通知 Hibernate 该表的列既作为主键又作为外键。为此,我们使用@PrimaryKeyColumn注释。

重要注释

注释 1: @Inheritance:该注释定义了用于实体类层次结构的继承策略。它在作为实体类层次结构根的实体类上指定。如果未指定此注解或未为实体类层次结构指定继承类型,则使用SINGLE_TABLE映射策略。

语法: @继承

@Entity
@Table("name = students")
@Inheritance(strategy = InheritanceType.JOINED)

// Class 
public class Student {

    // Insert code here
}

注释 2: @PrimaryKeyJoinColumn

此注释指定一个主键列,用作连接到另一个表的外键。它用于将JOINED映射策略中的实体子类的主表连接到其超类的主表。它在SecondaryTable注释中用于将辅助表连接到主表,并且它可以用于一对一映射,其中引用实体的主键用作被引用实体的外键。如果JOINED映射策略中的子类没有指定PrimaryKeyJoinColumn ,则假定外键列与超类的主表的主键列同名。

语法: @PrimaryKeyJoinColumn

@Entity
@Table("name = students")
@PrimaryKeyJoinColumn (name = "sid")

// Class
public class Student {
    // Insert code here
}

注释 3: @InheritanceType

此注释定义继承策略选项。 JOINED 是一种策略,其中特定于子类的字段映射到单独的表,而不是父类共有的字段,并执行连接以实例化子类

执行:

使用 Annotation 的每个子类类的表在此示例中,我们将创建三个持久性 类,并在 student.hbm.xml 文件中提供这些类的映射。

我们将创建如下所列的不同文件:

  1. 员工。Java
  2. 一个在 Employee 之上扩展的类。 Java类
  3. 依赖项 XML 文件
  4. 配置 XML 文件

A:员工类

Java
// Java Program to Illustrate Implementation of
// Employee Class
 
package com.exploit.org;
 
// Importing required classes
import javax.persistence.*;
 
// Annotations
@Entity
@Table(name = "employee")
@Inheritance(strategy = InheritanceType.JOINED)
 
// Class
public class Employee {
 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
 
    @Column(name = "ID")
    private String id;
 
    @Column(name = "Name") private String name;
}


Java
// Java Program to Illustrate Implementation of
// R_Employee Class
 
package com.exploit.org;
 
// Importing required classes
import javax.persistence.*;
 
// Annotations
@Entity
@Table(name = "r_employee")
@PrimaryKeyJoinColumn(name = "ID")
 
// Class
// Extending Employee class
public class R_Employee extends Employee {
 
    @Column(name = "salary") private double salary;
    @Column(name = "bonus") private double bonus;
}


Java
// Java Program to Illustrate Implementation of
// C_Employee Class
 
package com.exploit.org;
 
// Importing required classes
import javax.persistence.*;
 
// Annotations
@Entity
@Table(name = "c_employee")
@PrimaryKeyJoinColumn(name = "ID")
 
// Class
// Extending Employee class
public class C_Employee extends Employee {
 
    @Column(name = "pay") private double pay;
    @Column(name = "contract") private String contract;
}


XML
 
       org.hibernate 
       hibernate-core 
       5.3.1.Final 
 
 
 
       com.oracle 
       ojdbc14 
      10.2.0.4.0 
 


XML
 
 


B:文件:R_Employee。 Java,它实现了上面的“Employee”

例子:

Java

// Java Program to Illustrate Implementation of
// R_Employee Class
 
package com.exploit.org;
 
// Importing required classes
import javax.persistence.*;
 
// Annotations
@Entity
@Table(name = "r_employee")
@PrimaryKeyJoinColumn(name = "ID")
 
// Class
// Extending Employee class
public class R_Employee extends Employee {
 
    @Column(name = "salary") private double salary;
    @Column(name = "bonus") private double bonus;
}

C:文件:C_Employee。 Java,它实现了上面的“Employee”

Java

// Java Program to Illustrate Implementation of
// C_Employee Class
 
package com.exploit.org;
 
// Importing required classes
import javax.persistence.*;
 
// Annotations
@Entity
@Table(name = "c_employee")
@PrimaryKeyJoinColumn(name = "ID")
 
// Class
// Extending Employee class
public class C_Employee extends Employee {
 
    @Column(name = "pay") private double pay;
    @Column(name = "contract") private String contract;
}

D:文件:pom.xml  

例子:

XML

 
       org.hibernate 
       hibernate-core 
       5.3.1.Final 
 
 
 
       com.oracle 
       ojdbc14 
      10.2.0.4.0 
 

稍后,创建一个hibernate.cgf.xml配置文件并添加映射资源的条目。

例子:

XML