【问题标题】:Inheritance in Hibernate Annotations?Hibernate 注解中的继承?
【发布时间】:2009-09-03 13:04:27
【问题描述】:

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

【问题讨论】:

  • 你的问题没有太大意义。您能否提供有关您的问题的更多信息?
  • @Zoman - 如果您正在寻找如何在休眠中使用带有注释的继承,那么这个问题正是您所需要的。我刚刚搜索了这三个关键字,并在这里得到了答案。

标签: hibernate inheritance annotations


【解决方案1】:

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。

【讨论】:

    【解决方案2】:

    这是一个非常笼统的问题,但我建议您查看以下资源:

    但您问题的基本答案是您应该使用 @Inheritance 注释,如下所示:

    @Entity
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    public class Flight implements Serializable {
       ...
    }
    

    【讨论】:

    • 是的,因为我学习是为了学习它。我对这个话题很陌生。我的洋葱是混合的。所以谢谢你的资源。
    【解决方案3】:

    我建议在@MappedSuperclass 上使用@Inheritance 注释。过去我们遇到过问题,@MappedSuperclass 足够灵活,可以满足我们持续的维护需求。

    【讨论】:

    • Matt,您能否提出 MappedSuperClass 的问题,因为我们已在应用程序中广泛使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 2011-11-02
    • 2015-08-06
    相关资源
    最近更新 更多