Hibernate 3.0中的条件映射?
如何在hibernate中创建依赖于type属性的映射,在适当的列中插入/检索数据 结构: 表列:Hibernate 3.0中的条件映射?,hibernate,mapping,types,case,Hibernate,Mapping,Types,Case,如何在hibernate中创建依赖于type属性的映射,在适当的列中插入/检索数据 结构: 表列: |TYPE | CHARACTER | DATE | TIME | NUMERIC| POJO: class Pojo { private int type; private Object data; ... } 示例: 插入/更新 如果类型为1,则将值输入到列字符 挑选 如果类型为2,则从数值列获取值 提示: 在这种情况下,我们有两列并以结果为轴心的结构不是一个选项。这种行为是通
|TYPE | CHARACTER | DATE | TIME | NUMERIC|
POJO:
class Pojo {
private int type;
private Object data;
...
}
示例:
插入/更新
如果类型为1,则将值输入到列字符
挑选
如果类型为2,则从数值列获取值
提示:
在这种情况下,我们有两列并以结果为轴心的结构不是一个选项。这种行为是通过使用封装来实现的。例如,我在数据库INSERT/UPDATE中有一个字符串Y/N列,它由一个布尔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"/>
除了转换之外,我还使用了这个策略作为一种变通方法,允许字符串Java关键字用作枚举。请参见我为此选择的解决方案是使用整数鉴别器的每类表层次结构映射 我创建了一个基本抽象泛型类来存储对象
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 class NumericType extedns ValueBase<BigDecinal> {
public NumericType(){
super();
setValueType(IValueTypes.NUMERIC);
}
}
public class CharacterType extedns ValueBase<String> {
public NumericType(){
super();
setValueType(IValueTypes.CHARACTER);
}
}
提示:为了允许使用a数字作为鉴别器值,我们需要首先为我们正在映射的类指定它,因为默认情况下使用的是类名[String],而我尝试使用数字鉴别器进行子类映射,我们将得到一个hibernate错误,即存在某种类型不匹配
<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>
虽然我们从数据库中检索对象总是在给定的类型化类中,我们可以轻松地对其进行操作,但我们通过保存基类使用一个位置来保存它们 很接近,但这并不能完全解决我的问题。作为解决方案,我选择了带有整数鉴别器的表/类层次结构映射。这是封装的扩展版本。感谢您提供您的解决方案+1
<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>