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 >
