Will push a follow up shortly

> Am 22.10.2026 um 15:15 schrieb Francesco Chicchiriccò <[email protected]>:
> 
> Hum, this is not what I am seeing at
> 
> https://github.com/apache/openjpa/pull/220/changes#diff-b2a7225b359717a255a5118c3996fa15b43ba365c6b1812e3b20ccf064268b02R32
> 
> e.g.
> 
> @Converter
> public class ItemListConverter implements AttributeConverter<List<Item>, 
> String> {
> 
> while we have
> 
> @Converter
> public class PlainAttrListConverter implements 
> AttributeConverter<List<PlainAttr>, String> {
> 
> On 22/10/26 15:11, Maxim Solodovnik wrote:
>> I believe you still need to change your converter to have 2 generic
>> parameters AttributeConverter<PlainAttr, ?>
>> 
>> On Thu, 22 Oct 2026 at 20:06, Francesco Chicchiriccò
>> <[email protected]> wrote:
>>> So I went ahead, built the branch OPENJPA-3017 locally, then tried again 
>>> with Syncope but... got the same identical stacktrace.
>>> 
>>> Is there any non-default setting I should apply?
>>> 
>>> Thank you.
>>> Regards.
>>> 
>>> On 22/10/26 11:28, Francesco Chicchiriccò wrote:
>>>> On 22/10/26 11:24, Maxim Solodovnik wrote:
>>>>> On Thu, 22 Oct 2026 at 16:22, Francesco Chicchiriccò
>>>>> <[email protected]> wrote:
>>>>>> Hi Richard,
>>>>>> I saw (and approved) your PR, thank you!
>>>>>> 
>>>>>> Related to:
>>>>>>> As an interim mapping, the converted form may serve as the persistent 
>>>>>>> attribute: a String column holding the JSON, the List marked 
>>>>>>> @Transient, and the two directions be done in @PrePersist/@PreUpdate 
>>>>>>> and @PostLoad maybe?
>>>>>> this is the approach we follow up to Syncope 4.1.x, which is based on 
>>>>>> OpenJPA 4.1.1.
>>>>>> 
>>>>>> Some background information.
>>>>>> A while ago we switched to Hibernate ORM because of their support for 
>>>>>> JPA 3.2 (and the license change too, of course) since it was required by 
>>>>>> the Spring Boot platform upgrade.
>>>>>> OpenJPA was not ready at that time but now, considering the recent 
>>>>>> efforts here, we are reconsidering; only, we would rather not loose the 
>>>>>> code improvements applied so far.
>>>>>> 
>>>>>> Let's see how things are going after merging your PR, fingers crossed.
>>>>> You can test from branch :)
>>>> That's also true ;-)
>>>> I cannot dedicate much time today but this is definitely something 
>>>> possible, maybe I'll leave it on background and report afterwards.
>>>> 
>>>>> On 21/10/26 21:48, Richard Zowalla wrote:
>>>>>>> Hi Francesco,
>>>>>>> 
>>>>>>> Nothing obvious is missing. I see 2 things:
>>>>>>> 
>>>>>>> The first concerns the mapping itself. @Convert applied to a collection 
>>>>>>> attribute converts the elements, so List<PlainAttr> would require 
>>>>>>> AttributeConverter<PlainAttr, ?> together with @ElementCollection. 
>>>>>>> PlainAttrListConverter converts the collection as a whole into a single 
>>>>>>> column, which Hibernate accepts but which is undefined behaviour 
>>>>>>> (according to the spec), and the mapping is therefore not portable.
>>>>>>> 
>>>>>>> The second concerns a defect on our side, for which we need to fill a 
>>>>>>> bug. Reduced to an entity holding a List field and a whole-collection 
>>>>>>> converter, OpenJPA does not register the field at all: no column is 
>>>>>>> generated, and a persist followed by a find yields an empty list 
>>>>>>> without an error. The sole trace is a warning that the field has no 
>>>>>>> annotation indicating a persistence strategy, from which it follows 
>>>>>>> that @Convert is not treated as one. Silent loss of the attribute is a 
>>>>>>> more concerning outcome, more so than the exception you observed.
>>>>>>> 
>>>>>>> The exception itself did not reproduce from those annotations alone, 
>>>>>>> neither with a Serializable element type nor with a non-final field. 
>>>>>>> Its origin is HandlerFieldStrategy.map, which installs the handler 
>>>>>>> derived from the converter and then rejects columns supplied for the 
>>>>>>> element; the field is thus managed in your configuration and unmanaged 
>>>>>>> in my test setup. To check the difference  we would need to know 
>>>>>>> whether plainAttrs is declared in an orm.xml, whether any @Access, 
>>>>>>> @Basic or @Column reaches it by way of Attributable, Realm or an 
>>>>>>> attribute override, and which openjpa.* properties the unit sets. As an 
>>>>>>> interim mapping, the converted form may serve as the persistent 
>>>>>>> attribute: a String column holding the JSON, the List marked 
>>>>>>> @Transient, and the two directions be done in @PrePersist/@PreUpdate 
>>>>>>> and @PostLoad maybe?
>>>>>>> 
>>>>>>> Gruß
>>>>>>> Richard
>>>>>>> 
>>>>>>>> Am 21.10.2026 um 12:45 schrieb Francesco Chicchiriccò 
>>>>>>>> <[email protected]>:
>>>>>>>> 
>>>>>>>> Hi all,
>>>>>>>> I am testing OpenJPA 4.2.0-SNAPSHOT against Syncope master branch, 
>>>>>>>> which is currently using Hibernate ORM 7.4.
>>>>>>>> 
>>>>>>>> The first error I am encountering is related to [1] e.g.
>>>>>>>> 
>>>>>>>> @Convert(converter = PlainAttrListConverter.class)
>>>>>>>> private final List<PlainAttr> plainAttrs = new ArrayList<>();
>>>>>>>> 
>>>>>>>> where PlainAttr [2] is a Java bean configured for JSON serialization 
>>>>>>>> and PlainAttrListConverter[3] is an AttributeConverter leveraging 
>>>>>>>> Jackson for this purpose.
>>>>>>>> 
>>>>>>>> This works fine under Hibernate, but throws the following exception 
>>>>>>>> with OpenJPA 4.2.0-SNAPSHOT:
>>>>>>>> 
>>>>>>>> <openjpa-4.2.0-SNAPSHOT-ra2c8177 fatal user error> 
>>>>>>>> org.apache.openjpa.util.MetaDataException: You have supplied columns 
>>>>>>>> for 
>>>>>>>> "org.apache.syncope.core.persistence.jpa.entity.JPARealm.plainAttrs<element:class
>>>>>>>>  org.apache.syncope.core.persistence.api.entity.PlainAttr>", but this 
>>>>>>>> mapping cannot have columns in this context.
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.jdbc.meta.MappingInfo.assertNoSchemaComponents(MappingInfo.java:384)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.jdbc.meta.strats.HandlerFieldStrategy.map(HandlerFieldStrategy.java:84)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.jdbc.meta.FieldMapping.setStrategy(FieldMapping.java:148)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.jdbc.meta.RuntimeStrategyInstaller.installStrategy(RuntimeStrategyInstaller.java:87)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.jdbc.meta.FieldMapping.resolveMapping(FieldMapping.java:519)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:470)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.jdbc.meta.ClassMapping.resolveNonRelationMappings(ClassMapping.java:1066)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.jdbc.meta.MappingRepository.prepareMapping(MappingRepository.java:420)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.preMapping(MetaDataRepository.java:780)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:667)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:427)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:398)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.PersistenceMetaDataDefaults.getCachedSuperclassMetaData(PersistenceMetaDataDefaults.java:355)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.PersistenceMetaDataDefaults.determineAccessType(PersistenceMetaDataDefaults.java:381)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.PersistenceMetaDataDefaults.populate(PersistenceMetaDataDefaults.java:317)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.addMetaData(MetaDataRepository.java:933)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.addMetaData(MetaDataRepository.java:918)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.getMetaData(AnnotationPersistenceMetaDataParser.java:828)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.parseClassAnnotations(AnnotationPersistenceMetaDataParser.java:582)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.parse(AnnotationPersistenceMetaDataParser.java:440)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.PersistenceMetaDataFactory.load(PersistenceMetaDataFactory.java:267)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:595)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:406)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:398)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.PersistenceMetaDataDefaults.getCachedSuperclassMetaData(PersistenceMetaDataDefaults.java:355)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.PersistenceMetaDataDefaults.determineAccessType(PersistenceMetaDataDefaults.java:381)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.PersistenceMetaDataDefaults.populate(PersistenceMetaDataDefaults.java:317)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.addMetaData(MetaDataRepository.java:933)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.addMetaData(MetaDataRepository.java:918)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.getMetaData(AnnotationPersistenceMetaDataParser.java:828)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.parseClassAnnotations(AnnotationPersistenceMetaDataParser.java:582)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.parse(AnnotationPersistenceMetaDataParser.java:440)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.PersistenceMetaDataFactory.load(PersistenceMetaDataFactory.java:267)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:595)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:406)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:398)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.meta.MetamodelImpl.<init>(MetamodelImpl.java:91)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.EntityManagerFactoryImpl.getMetamodel(EntityManagerFactoryImpl.java:474)
>>>>>>>>           at 
>>>>>>>> org.apache.openjpa.persistence.EntityManagerFactoryImpl.getMetamodel(EntityManagerFactoryImpl.java:81)
>>>>>>>> 
>>>>>>>> 
>>>>>>>> Is there anything obvious I am missing?
>>>>>>>> 
>>>>>>>> TIA
>>>>>>>> Regards.
>>>>>>>> 
>>>>>>>> [1] 
>>>>>>>> https://github.com/apache/syncope/blob/master/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java#L83-L84
>>>>>>>> [2] 
>>>>>>>> https://github.com/apache/syncope/blob/master/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/PlainAttr.java
>>>>>>>> [3] 
>>>>>>>> https://github.com/apache/syncope/blob/master/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/converters/PlainAttrListConverter.java--
> 
> -- 
> Francesco Chicchiriccò
> 
> Tirasa - Open Source Excellence
> http://www.tirasa.net/
> 
> Member at The Apache Software Foundation
> Syncope, Cocoon, Olingo, CXF, OpenJPA
> https://about.me/ilgrosso

Reply via email to