Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 3.0中的条件映射?_Hibernate_Mapping_Types_Case - Fatal编程技术网

Hibernate 3.0中的条件映射?

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,则从数值列获取值 提示: 在这种情况下,我们有两列并以结果为轴心的结构不是一个选项。这种行为是通

如何在hibernate中创建依赖于type属性的映射,在适当的列中插入/检索数据

结构:

表列:

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