У меня есть класс сущностей 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>
Заранее спасибо!