Как использовать JPA AttributeConverter с Hibernate-Mapping XML (HBM 4.3)? - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь преобразовать тип в моей БД в другой тип для использования в моей сущности. Проводя некоторые исследования, я узнал о классе AttributeConverter, определенном в JPA 2.1, я считаю.

Все мои классы созданы из Avro, поэтому аннотации JPA / HBM не будут использоваться

Все классы сопоставляются с использованием файлов hbm.xml, а не сопоставления сущностей. Все дБ соединения чтения и записи работает. Так что конфиги hbm верны, просто есть проблемы с преобразованием типов.

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

Я попытался просто добавить конвертер как тип

Это единственное, что я могу попробовать. За пределами аннотаций, которые невозможны с моей реализацией

class.hbm.xml

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

DateToLongConverter.java [Игнорировать логику заполнителя!]

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

    }
}

Результаты с приведенным выше кодом являются просто исключением: Could not determine type for: dao.converter.DateToLongConverter, at table: ATABLE, for columns: [org.hibernate.mapping.Column(A_COLUMN)]

Я также пытался добавить META-INF / persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence
        version="2.1"
        xmlns="http://xmlns.jcp.org/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

    <persistence-unit name="case-consumer-persistence">
        <class>dao.converter.DateToLongConverter</class>
        <class>aClass</class>
    </persistence-unit>
</persistence>

1 Ответ

0 голосов
/ 09 июля 2019

Я никогда не определял постоянную сущность с помощью XML-конфигурации, но я надеюсь, что это поможет:

Вы определяете тип dao.converter.DateToLongConverter для "aColumn", но на самом деле вы должны определить конвертер для него. Тип, который вы упомянули, должен быть объектом типа, с которым вы работаете в своем коде: в вашем примере ваш тип должен быть Long.

Этот другой ответ поможет вам определить ваш конвертер в конфигурации xml. Это просто другой формат для имени типа.

Вот как @Convert определяется с аннотациями. Вы должны искать тиражирование этого шаблона на вашем hbm.

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Convert(converter = DateToLongConverter.class)
    private Long aColumn;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...