2010-09-02 96 views
0

我有這個結構的映射是我設計Hibernate的不同類型的POJO映射

public abstract class A<T> { 
private int discriminator_value = -1; 
private T value; 
//... 
} 

public class One extends A<String> { 

public One(){ 
    setDiscriminatorValue(1); 
} 
//... 
} 

public class Two extends A<BigDecimal> { 

public Two(){ 
    setDiscriminatorValue(2); 
} 
//... 
} 

public class Three extends A<Date> { 

public Three(){ 
    setDiscriminatorValue(3); 
} 
//... 
} 


public class TheTargetSolution { 
    private Long info1; 
    private Long info2; 
    private Long info3; 
    private A targetPojo; 
//... 
} 

表結構的問題

THE_TARGET_SOLUTION_TABLE 
    - INFO_1 NUMBER(10) 
    - INFO_2 NUMBER(10) 
    - INFO_3 NUMBER(10) 
    - DISCRIM NUMBER(2) 
    - TEXT_A NVARCHAR2(200 BYTE) 
    - NUMBER_A NUMBER(10) 
    - DATE_A DATE 

主要的事情是,我們必須TheTargetSolution是一個類A類的targetPojo,並且這個類沒有映射,(我們需要更多的信息給實體,而且使用關係來做這件事是沒有選擇的,在這種情況下,所有的數據都必須存儲在一個表中)那是app的類型的實例一直到鑑別者。

恢復

當DISCRIM列值是1的targetPojo應由類型的一個

當DISCRIM列值是2的targetPojo應由類型的兩個

當DISCRIM列值爲3 targetPojo應該按類型三

有什麼建議嗎?

+0

您使用XML協作的所有POJO到一個表的解決方案,或註釋? – Bozho 2010-09-10 11:17:01

+0

我使用XML映射 – 2010-09-10 11:24:14

回答

1

這是inheritance的典型場景,具有按類表層次結構的表。如果您使用xml,請參閱鏈接的文檔。如果使用註釋,使用

@MappedSuperclass 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="DISCRIM", discriminatorType=INTEGER) 
public abstract class A { 
    // properties here 
} 

然後

@Entity 
@DiscriminatorValue("1") 
public class Two extends A<BigDecimal> 
+0

是的,沒有。這裏所討論的情況是,類A不能被映射,並且應該以某種方式被用作組件。這是因爲在A中使用的數據是由幾個表格組成的(它們的含義不同)而當使用按類表層次結構時,我將不得不重新設計數據庫中的所有邏輯 – 2010-09-10 11:34:10

+0

請參閱'@ MappedSuperclass'。我不知道xml equivallent,但這意味着A沒有serpate表。無論如何,我無法看到您的整個數據庫,以便作出更好的判斷 – Bozho 2010-09-10 11:53:52

+0

這可能適用於hibernate的註釋符號,但我沒有發現任何XML的等價物,但這可以被接受。感謝您的時間和精力。 – 2010-10-27 21:54:16

1

在此請看:https://github.com/candybon/fasttrack 它提供

+0

歡迎來到Stack Overflow!雖然這可能在理論上回答這個問題,[這將是更可取的](http://meta.stackexchange.com/q/8259)在這裏包括答案的重要部分,並提供供參考的鏈接。 – Emil 2012-11-20 21:34:47