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 > -- Best regards, Maxim
