【问题标题】:What's the equivalent of @Convert in hibernate hbm file?hibernate hbm 文件中的 @Convert 等价物是什么?
【发布时间】:2016-08-02 11:25:18
【问题描述】:

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

我在 hbm 表示法中找不到 @Convert 的等价物。

一个例子将不胜感激。

当我搜索这个时,可以理解的是,Google 会返回很多关于“自动将 hbm 文件转换为实体,反之亦然”的工具/方法的结果。

编辑: 现在我怀疑 hbm 文件中是否有一个选项,因为这是 JPA 注释。

@Convert 的文档说:

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

编辑:更正了转换器代码。

【问题讨论】:

  • JPA 不使用休眠配置文件。它使用orm.xml。如果您不使用 JPA,请删除 JPA 标签
  • @NeilStockton 我用的是hibernate,相信hibernate也是JPA的一个实现,Convert来自javax.persistence。我对吗?如果还是有问题,我会删除。谢谢。我们在 hbm 文件中有 EnumType.ORDINAL, STRING 的等价物,因此问题。
  • 是的,Hibernate 确实实现了 JPA,但 JPA 不使用“hbm”文件。 JPA 使用 orm.xml。如果您使用的是 hbm 文件,那么您只使用了 HIBERNATE。
  • 我删除了,以为有 javax.persistence.Convert,以防这会出现在关注 JPA 的人的提要上。 JPA 涉及到一个元素,有些人可能知道答案。它是重叠的。
  • 如果使用 orm.xml 的“convert”定义在此链接datanucleus.org/products/accessplatform_5_0/jpa/…

标签: java hibernate enums


【解决方案1】:

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

【讨论】:

  • 我已经在转换器中设置了 autoapply=true,但是休眠没有使用它。使用此解决方案中提到的第一个选项有效 - > 前缀转换:: 于 2018 年 11 月测试。奇怪的是 autoapply=true 从 jpa-xml 更改为 hibernate-xml 时对我不起作用
  • 这告诉我你没有告诉 Hibernate 那个转换器类
【解决方案2】:

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
    }

}

【讨论】:

  • 但是实体仍然会有枚举的实际类型?
  • 是的,使用Convert,您可以在持久化和检索的同时更改类型,对吗?所以实体和数据库中的数据类型会有所不同
  • 我在实体 Person 中使用 Enum,比如说 Gender,现在有 GenderConverter,我们想在 Person.hbm.xml 中映射这些?我试过了,但它给出了无法确定 GenderConverter 错误的类型。请注意,我没有为 Person 实体中的性别字段使用任何注释。
  • 能否贴出问题中的hbm映射文件、转换器代码及异常
  • @pinkpanther 我更新了答案,必须在类型属性中提及完全限定名称而不仅仅是类名
【解决方案3】:

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

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

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

例如:

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

【讨论】:

    猜你喜欢
    • 2021-06-28
    • 2011-11-06
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多