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

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

问题描述

如何配置使用Java注解Hibernate的继承映射?什么是注释使用继承的优势是什么?

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>


  • 优点:最简单的。没有加入要求

  • 缺点:不能使用空值。列#增加与对象图的深度。

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 (?, ?)


  • 优点:标准化的数据结构

  • 缺点:加入总是REQD

  • 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天全站免登陆