Hibernate 注解中的继承? [英] Inheritance in Hibernate Annotations?

查看:19
本文介绍了Hibernate 注解中的继承?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何使用 Java 注释配置 Hibernate 继承映射?在 Annotations 中使用继承有什么好处?

How can I configure Hibernate inheritance mappings using Java annotations? What are the advantages of using inheritance in Annotations?

推荐答案

3种可能的类型:

1.每类层次结构单表策略:

 @Entity
 @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
 @DiscriminatorColumn(      name="planetype",
  discriminatorType=DiscriminatorType.STRING      )
 @DiscriminatorValue("Plane")
 public class Plane { ... }

 @Entity
 @DiscriminatorValue("A320")
 public class A320 extends Plane { ... }     


 <hibernate-mapping>
 <subclass name="DomesticCat" extends="Cat" discriminator-value="D">
      <property name="name" type="string"/>
 </subclass>

  • 优点:最简单.无需 JOIN
  • 缺点:不能使用空值.# 列随着对象图深度的增加而增加.
  • <强>2.加入子类策略:

    数据库表

    CREATE TABLE SUPER_TABLE(
    id_col number primary key,
    sup_Name varchar2(20));
    
    CREATE TABLE  SUB_TABLE(
    SUP_ID primary key,
    sub_name varchar2(20),
    constraint SUB_TABLE_fk foreign key (sup_Id)  references    super_table(id_col));
    
    
    @Entity
    @Table(name= "SUPER_TABLE")
    @Inheritance(strategy= InheritanceType.JOINED)
        public class TestSuperClass {
    @Id
    @GeneratedValue(
            strategy=GenerationType.SEQUENCE, 
            generator="SEQ_GEN")
        @SequenceGenerator(
            name="SEQ_GEN",
            sequenceName="hibernate_sequence"
        )
        @Column(name ="id_col")
    private long idcol;
    @Column(name ="sup_name")
    private String supName;
    
    
    @Entity 
    @Table(name="SUB_TABLE")
    @PrimaryKeyJoinColumn(name="SUP_ID")
    
    <class name="Payment" table="PAYMENT">
    <id name="id" type="long" column="PAYMENT_ID">
        <generator class="native"/>
    </id>
    <property name="amount" column="AMOUNT"/>
    ...
    <joined-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">
        <key column="PAYMENT_ID"/>
        <property name="creditCardType" column="CCTYPE"/>
        ...
    </joined-subclass>
    <joined-subclass name="CashPayment" table="CASH_PAYMENT">
        <key column="PAYMENT_ID"/>
        ...
    </joined-subclass>
    
    public class TestSubClass extends TestSuperClass{ 
        private String sub_name; 
    }
    

    测试模块

    TestSubClass sub = new TestSubClass("sub1");
    sub.setSupName("supersuper"); session1.save(sub);
    

    SQL 生成

     Hibernate: insert into SUPER_TABLE (sup_name, id_col) values (?, ?)    
     Hibernate: insert into SUB_TABLE (sub_name, SUP_ID) values (?, ?)
    

    • 优点:规范化的数据结构.
    • 缺点:JOINS 总是需要的.
    • 3.每个具体类策略的表:

      create table CREDIT_CARD( payment_id number primary key, amount
      number, creditCardType varchar2(2) );
      
      
        @Entity
        @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
        public abstract class Payment {
      @Id
      @GeneratedValue(
              strategy=GenerationType.SEQUENCE, 
              generator="SEQ_GEN")
          @SequenceGenerator(
              name="SEQ_GEN",
              sequenceName="hibernate_sequence"
          )
      @Column(name = "payment_id")
      private long id;
      
      private double amount;
      
      
      
       @Entity
       @Table(name="CREDIT_CARD")
       public class CreditCardPayment extends Payment {
      private String creditCardType;
      
      
       <class name="Payment">
      <id name="id" type="long" column="PAYMENT_ID">
          <generator class="sequence"/>
      </id>
      <property name="amount" column="AMOUNT"/>
      ...
      <union-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">
          <property name="creditCardType" column="CCTYPE"/>
          ...
      </union-subclass>
      

      测试模块

      CreditCardPayment credit = new CreditCardPayment("C",1.0);
      session1.save(credit);
      

      SQL 生成

        Hibernate: insert into CREDIT_CARD (amount, creditCardType, payment_id) values (?, ?, ?)
      

      还有一个我们在应用程序中使用的@MappedSuperClass.

      There's also a @MappedSuperClass which we have used in our application.

      这篇关于Hibernate 注解中的继承?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆