什么是hibernate hbm文件中@Convert的等价物?

时间:2016-08-02 11:25:19

标签: java hibernate enums

我写了一个属性转换器。我想在一个实体中应用它。到目前为止,我遵循纯粹的XML方法。

我在 hbm 表示法中找不到等效的@Convert

一个例子将不胜感激。

当我搜索此内容时,可以理解的是,Google会在"自动将hbm文件转换为实体,以及#34;自动将hbm文件转换为实体时返回大量有关工具/方法的结果。

修改 现在我怀疑hbm文件中是否有选项,因为这是JPA注释。

@Convert的文件说:

  

转换注释用于指定Basic的转换   场地或财产。没有必要使用Basic注释或   相应的XML元素指定基本类型。

我不完全确定这意味着什么。在这种情况下,混合注释和XML是一种方法吗?

我试过这个:

public class Person {
   //this is enum
   private Ethnicity ethnicity;
   //.....
}

public enum Ethnicity{
   INDIAN("IND"),
   PERSIAN("PER")
   //...constructors and value field.

   public String value(){
     return this.value;
   }

   public Ethnicity fromValue(String value){
       //logic for conversion
   }
}

转换器:

@Converter
public class EthnicityConverter implements AttributeConverter<Ethnicity,String> {

        @Override
        public Ethnicity convertToEntityAttribute(String attribute) {
            if ( attribute == null ) {
                return null;
            }

            return Ethnicity.fromValue( attribute );
        }

        @Override
        public String convertToDatabaseColumn(Ethnicity dbData) {
            if ( dbData == null ) {
                return null;
            }

            return dbData.value();
        }
}

HBM文件:

//....other columns
 <property name="ethnicity">
            <column name="ethnicity"/>
            <type name="EthnicityConverter"/>
        </property>
//....other columns

修改:更正了转换器代码。

3 个答案:

答案 0 :(得分:3)

Sarvana的答案很接近 - 事实上你确实使用了type XML属性。但是,type用于命名Hibernate Type。但是,有一个约定命名为AttributeConverter - 只需将前缀converted::应用于AttributeConverter FQN即可。例如,

 <property name="ethnicity">
            <column name="ethnicity"/>
            <type name="converted::EthnicityConverter"/>
 </property>

另一种选择是自动应用转换器:

@Converter( autoApply=true)
public class EthnicityConverter implements AttributeConverter<Ethnicity,String> {
    ...
}

鉴于上面的转换器,只要Hibernate知道它,Hibernate就会将其应用于Ethnicity类型的任何属性。

HTH

答案 1 :(得分:1)

typeConvert注释的等效xml属性。

下面是转换为DB中的Y / N和实体中的布尔值。

<property name="status" column="book_status" type="yes_no" not-null="true"/>

只需将yes_no替换为您的自定义converter

即可

请参阅我的回答  https://stackoverflow.com/a/37914271/3344829

官方文件 https://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch06.html

<强>更新

<property name="ethnicity" column="ethnicity" type="com.example.EthnicityConverter"/>

<强>更新

@Converter
public class EthnicityConverter implements AttributeConverter<Ethnicity, String> {

    @Override
    public String convertToDatabaseColumn(Ethnicity attribute) {
        // TODO return String value of enum
    }

    @Override
    public Ethnicity convertToEntityAttribute(String dbData) {
        // TODO return resolved enum from string
    }

}

答案 2 :(得分:0)

我也不得不面对这个问题,而且我能够解决它。

参考:Hibernate 5 Documentation示例33. AttributeConverter的HBM映射

我们必须对包使用确切的类。

Ex:

sleep