2010-07-06 29 views
2

如何在hibernate中創建依賴於類型屬性的映射,將數據插入/從適當的列中檢索數據。Hibernate 3.0中的條件映射?

結構:

表列:

|TYPE | CHARACTER | DATE | TIME | NUMERIC| 

POJO:

class Pojo { 

private int type; 
private Object data; 

... 

} 

例子:

  • 插入/更新
    如果類型爲1個,我們輸入的值列字符

  • 選擇
    如果類型爲2,我們從列NUMERIC值

提示: ,我們有兩列的結構我們的PIVOT結果不適用於這種情況。

回答

2

我爲此選擇的解決方案是使用整數鑑別器對每類類層次結構進行映射。

我創建了存儲對象

public abstract class ValueBase<T> { 

    private Long id; 
    private int valueType; 
    private T value; 

    public T getValue(){ 
    return value; 
    } 

    public void setValue(T value){ 
    this.value = value; 
    } 

    protected void setValueType(int valueType) { 
     this.valueType = valueType; 
    } 

    public int getValueType(){ 
    return this.valueType; 
    } 

    private void setID(Long id) { 
     this.id = id; 
    } 

    public int getID(){ 
    return this.id; 
    } 


} 

對於類型管理我已創建和接口抽象基泛型類,但有可能使用由亞瑟提出的封裝來枚舉。

public interface IValueTypes() { 

public static final int NONE = -1; 
public static final int NUMERIC = 0; 
public static final int CHARACTER = 1; 
public static final int DATE = 2; 
public static final int TIME = 3; 
public static final int BOOLEAN = 4; 

} 

的每種類型的我已經創建的類

public class NumericType extedns ValueBase<BigDecinal> { 

    public NumericType(){ 
     super(); 
     setValueType(IValueTypes.NUMERIC); 
    } 

} 

public class CharacterType extedns ValueBase<String> { 

    public NumericType(){ 
     super(); 
     setValueType(IValueTypes.CHARACTER); 
    } 

} 

提示:要允許使用一個數字作爲鑑別價值,我們需要先指定它爲我們測繪類,因爲默認情況下是使用類名[字符串],我們嘗試使用數字鑑別器進行子類映射,我們將得到一個休眠錯誤,說有一些類型不匹配。

<class name="TestValue" table="TestValues" schema="TEST" abstract="true" discriminator-value="-1"> 
    <id name="id" type="java.lang.Long"> 
    <column name="VALUE_ID" precision="22" scale="0" /> 
    <generator class="native"/> 
    </id> 

    <discriminator column="TYPE_VALUE" not-null="false" type="integer"/> 

    <subclass discriminator-value="0" name="NumericType"> 
    <property name="value" type="java.math.BigDecimal" column="NUMERIC" not-null="false"/> 
    </subclass> 

    <subclass discriminator-value="1" name="CharacterType"> 
    <property name="value" type="java.lang.String" column="CHARACTER" not-null="false"/> 
    </subclass> 

</class> 

雖然我們從數據庫中檢索的對象總是在我們可以很容易操作給出類型類,我們用一個地方通過保存的基類來拯救他們。

+0

感謝您提供您的解決方案(+1) – 2010-08-16 15:10:47

1

這種行爲是通過封裝完成的。例如,我有一個字符串(Y/N)柱在數據庫(INSERT/UPDATE),其由一個布爾包封(SELECT)如下

public class SomeEntity { 

    private boolean checked; 

    private boolean isChecked() { 
     return this.checked; 
    } 

    public void setChecked(boolean checked) { 
     this.checked = checked; 
    } 

    public String getCheckedAsString() { 
     return checked ? "Y" : "N"; 
    } 

    public void setCheckedAsString(String checked) { 
     this.checked = checked.equals("Y") ? true : false; 
    } 

} 

你映射到這裏

<property name="checkedAsString" type="string" column="CHECKED"/> 

這戰略是解釋here我已經使用,除了轉換,作爲解決方法允許字符串Java關鍵字用作Enum。請參閱here

+0

關閉但這並不能完整解決我的問題。作爲解決方案,我選擇了每個類的層次結構映射與整數鑑別器。這是封裝的一些擴展版本。 – 2010-08-16 09:34:30