如何在Hibernate-Mapping XML(HBM 4.3)中使用JPA AttributeConverter?

时间:2019-07-09 15:32:34

标签: java hibernate hibernate-mapping jpa-2.1 hibernate-4.x

我正在尝试将数据库中的一种类型转换为供我的实体使用的另一种类型。我进行了一些研究,发现我相信JPA 2.1中定义的AttributeConverter类。

我的课程都是从Avro生成的,因此不会使用JPA / HBM注释

所有类均使用hbm.xml文件而不是实体映射进行映射 所有的数据库连接读写。因此,hbm配置仅在类型转换方面存在问题是正确的。

<QString, QString>

我试图简单地将转换器添加为类型  

这是我唯一想尝试的方法。在我的实现无法实现的注释之外

class.hbm.xml

Relevant Tech Stack
-
HB Version: 4.3.11.Final
JPA Version: 2.1

DateToLongConverter.java [忽略占位符逻辑!]

<hibernate-mapping default-lazy="false">
    <class name="ACLASS" table="CASE">
        <id name="id" type="long" column="id">
            <generator class="native"/>
        </id>
        <property name="aColumn" type = "dao.converter.DateToLongConverter" column = "A_COLUMN" />
    </class>
</hibernate-mapping>

以上代码的结果只是一个例外: @Converter(autoApply=true) public class DateToLongConverter implements AttributeConverter<Long, java.sql.Date> { @Override public java.sql.Date convertToDatabaseColumn(Long millitime) { System.out.println(millitime); return new Date(1); } @Override public Long convertToEntityAttribute(java.sql.Date dbData) { System.out.println(dbData.toString()); return 1L; } }

我也尝试添加META-INF / persistence.xml

Could not determine type for: dao.converter.DateToLongConverter, at table: ATABLE, for columns: [org.hibernate.mapping.Column(A_COLUMN)]

1 个答案:

答案 0 :(得分:0)

我从未使用.xml配置定义持久实体,但希望对您有所帮助:

您正在为“ aColumn”定义类型dao.converter.DateToLongConverter,但是实际上,您应该为其定义一个转换器。您提到的类型应该是您在代码中使用的类型对象:在您的示例中,您的类型应该是Long

另外answer可以帮助您在xml配置上定义转换器。它只是类型名称的另一种格式。

这是通过注释定义@Convert的方式。您应该要在hbm上复制此模板。

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Convert(converter = DateToLongConverter.class)
    private Long aColumn;
}