JPAMetaModelEntityProcessor: "Невозможно определить тип для свойства"при отображении через orm.xml - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть класс сущностей JPA, который полностью настроен из orm.xml (без аннотаций).Одним из свойств класса сущностей является String[], который преобразуется в простое String представление на стороне базы данных посредством реализации javax.persistence.AttributeConverter<String[], String>.Я хотел бы сгенерировать информацию метамодели для сущности, используя org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor или аналогичный.

Однако JPAMetaModelEntityProcessor, похоже, игнорирует преобразование, определенное в orm.xml, так как выдает следующую ошибку:

--- maven-processor-plugin:2.2.4:process (process) @ ConverterTest ---
diagnostic: warning: Unable to determine type for property tags of class test.convertertest.Post using access type FIELD

Конфигурация работает нормально, если я использую аннотации вместо orm.xml, поэтому я предполагаю, что процессор не может определить типы преобразования из обобщенных классов.Однако я не могу найти какой-либо другой способ явного их определения.

Обратите внимание, что процессор также работает нормально (с ожидаемыми выходными данными), если атрибут массива опущен.

I 'мы попытались заменить String[] на List<String> в объекте и преобразователе, в этом случае процессор завершает работу без проблем, но генерирует некомпилируемый код:

// Post_.java
public static volatile SingularAttribute<Post, List<E>> tags; // cannot find symbol E

Это недокументированная ошибка / ограничение, или я пропустилгде-то спецификация?

Ниже приведен пример класса сущности, который иллюстрирует проблему (надуманный, в основном скопированный с здесь ):

public class Post implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    // other stuff

    private String[] tags;

    // boilerplate nonsense
}

А вот и форма.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_2.xsd" version="2.2">
    <persistence-unit-metadata>
        <xml-mapping-metadata-complete/>
    </persistence-unit-metadata>
    <access>FIELD</access>
    <entity class="test.convertertest.Post" name="Post">
        <table name="POST"/>
        <attributes>
            <id name="id">
                <column name="ID"/>
                <generated-value strategy="AUTO"/>
            </id>
            <!-- other stuff -->
            <basic name="tags">
                <column name="TAGS"/>
                <convert converter="test.convertertest.ListToStringConverter"/>
            </basic>
        </attributes>
    </entity>
</entity-mappings>

Конвертер:

@Converter
public class ListToStringConverter implements AttributeConverter<String[], String> {

    @Override
    public String convertToDatabaseColumn(String[] attribute) {
        return (attribute == null || attribute.length == 0) ? "" : String.join(",", attribute);
    }

    @Override
    public String[] convertToEntityAttribute(String dbData) {
        return (dbData == null || dbData.isEmpty()) ? new String[0] : dbData.split(",");
    }
}

Соответствующая запись pom.xml:

<plugin>
    <groupId>org.bsc.maven</groupId>
    <artifactId>maven-processor-plugin</artifactId>
    <version>2.2.4</version>
    <executions>
        <execution>
            <id>process</id>
            <goals>
                <goal>process</goal>
            </goals>
            <phase>generate-sources</phase>
            <configuration>
                <processors>                                
                    <processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>
                </processors>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jpamodelgen</artifactId>
            <version>5.4.1.Final</version>
        </dependency>
    </dependencies>
</plugin>

Заранее спасибо!

...