2009-09-03 9 views
26

Javaアノテーションを使用してHibernate継承マッピングを設定するにはどうすればよいですか?アノテーションで継承を使用する利点は何ですか?ハイバネートアノテーションの継承?

+3

あなたの質問はあまり意味がありません。あなたの問題に関する詳細情報を提供できますか? – Zoman

+6

@Zoman - 休止状態でアノテーションを継承する方法を探しているなら、この質問は必要なものです。私はこれらの3つのキーワードを探せば、ここで答えを得た。 – ripper234

答えて

7

は、これは非常に一般的な質問ですが、私は次のリソースでご覧になることをお勧めする:

しかし、あなたの質問に非常に基本的な答えはとても好きですが、@Inheritanceアノテーションを使用する必要があることです。

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

私はそれを学ぶために勉強しています。私は見知らぬ人です。私のタマネギはミックスです。リソースに感謝します。 – stical

0

私は@MappedSuperclass上@Inheritanceアノテーションを使用してお勧めします。 @MappedSuperclassは、私たちの継続的なメンテナンスニーズのために十分な柔軟性を持っています。

+5

Matt、MappedSuperClassの問題点は、アプリケーションで広く使用されているのでお勧めしますか? – Achow

51

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は必要ありません。
  • 短所:NULLは使用できません。オブジェクトグラフの深さとともに列の数が増えます。

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もありますインウルアプリケーション。