2009-09-03 117 views
26

Làm thế nào tôi có thể cấu hình ánh xạ kế thừa Hibernate bằng cách sử dụng chú thích Java? Những lợi thế của việc sử dụng thừa kế trong Chú thích là gì?Thừa kế trong Chú thích Hibernate?

+3

Câu hỏi của bạn không có ý nghĩa quá nhiều.Bạn có thể cung cấp thêm thông tin về vấn đề của mình không? – Zoman

+6

@Zoman - nếu bạn đang tìm kiếm cách sử dụng tính không trung thực với chú thích ở chế độ ngủ đông, câu hỏi này chỉ là những gì bạn cần. Tôi chỉ googled ba từ khóa này, và có câu trả lời ở đây. – ripper234

Trả lời

7

Đây là một câu hỏi rất chung chung, nhưng tôi muốn khuyên dùng một cái nhìn tại các nguồn sau:

Nhưng câu trả lời rất cơ bản cho câu hỏi của bạn là bạn nên sử dụng @Inheritance chú thích, như vậy:

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

Có vì tôi học để học nó. Tôi xa lạ chủ đề này. Hành tây của tôi là trộn. Cảm ơn bạn vì tài nguyên. – stical

0

tôi sẽ đề nghị sử dụng các chú thích @Inheritance qua @MappedSuperclass. Chúng tôi đã gặp sự cố trong quá khứ với @MappedSuperclass đủ linh hoạt cho các nhu cầu bảo trì liên tục của chúng tôi.

+5

Matt, bạn có thể vui lòng đề xuất những vấn đề với MappedSuperClass, vì chúng tôi đã sử dụng nó rộng rãi trong ứng dụng của chúng tôi. – Achow

51

3 loại tốt:

1. bảng Độc thân mỗi chiến lược hệ thống phân cấp lớp:

@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> 

  • Ưu điểm: đơn giản nhất. Không có JOIN yêu cầu
  • Nhược điểm: Không thể sử dụng giá trị rỗng. Số cột tăng với độ sâu đồ thị đối tượng.

2. Tham gia chiến lược lớp con:

Database Bàn

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; 
} 

thử nghiệm module

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

SQL tạo

Hibernate: insert into SUPER_TABLE (sup_name, id_col) values (?, ?)  
Hibernate: insert into SUB_TABLE (sub_name, SUP_ID) values (?, ?) 
  • Ưu điểm: Cấu trúc dữ liệu được chuẩn hóa.
  • Nhược điểm: JOINS luôn reqd.

3. Bảng mỗi chiến lược lớp bê tông:

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> 

mô-đun thử nghiệm

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

SQL tạo

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

Ngoài ra còn có một @MappedSuperClass mà chúng tôi đã sử dụng tôi không ứng dụng ur.

Các vấn đề liên quan