Hi all.
I've upgraded to OpenEJB 3.1.1, and having an issue with mappings using OpenJPA
specific annotations, such as @Persistent to persist an InputStream as blob.
The strange part is that I was already using OpenJPA 1.2.1 with OpenEJB 3.1.0,
and without problems. If I revert to this version, everything works ok.
Previously I had the same problem when I accidentally left the openjpa-XXX.jar
file in WEB-INF/lib (thus @Persistent was defined in 2 separate classloaders,
the global and the web-app specific, which caused problems). That's not the
case now.
The exception root cause:
Caused by: <openjpa-1.2.0-r422266:683325 fatal user error>
org.apache.openjpa.persistence.ArgumentException: Embedded property
"nl.strohalm.cyclos.entities.customization.images.Image.image" declares a
mapping override for "contents", but that is not a persistent property in the
embedded type.
at
org.apache.openjpa.persistence.jdbc.AnnotationPersistenceMappingParser.parseAttributeOverrides(AnnotationPersistenceMappingParser.java:1208)
at
org.apache.openjpa.persistence.jdbc.AnnotationPersistenceMappingParser.parseMemberMappingAnnotations(AnnotationPersistenceMappingParser.java:962)
at
org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.parseClassAnnotations(AnnotationPersistenceMetaDataParser.java:622)
at
org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.parse(AnnotationPersistenceMetaDataParser.java:352)
at
org.apache.openjpa.persistence.PersistenceMetaDataFactory.load(PersistenceMetaDataFactory.java:229)
at
org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:474)
at
org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:294)
at
org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:581)
at
org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:541)
at
org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:308)
at
org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:581)
at
org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:541)
at
org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:308)
at
org.apache.openjpa.meta.ValueMetaDataImpl.resolveDeclaredType(ValueMetaDataImpl.java:431)
at
org.apache.openjpa.meta.ValueMetaDataImpl.resolve(ValueMetaDataImpl.java:410)
at
org.apache.openjpa.jdbc.meta.ValueMappingImpl.resolve(ValueMappingImpl.java:470)
at
org.apache.openjpa.meta.FieldMetaData.resolve(FieldMetaData.java:1676)
at
org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:416)
at
org.apache.openjpa.meta.ClassMetaData.resolveMeta(ClassMetaData.java:1689)
at
org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1624)
at
org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataRepository.java:717)
at
org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:616)
at
org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:541)
... 65 more
The involved classes:
@MappedSuperclass
public abstract class Image extends BaseEntity {
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "height", column = @Column(name =
"thumbnail_height")),
@AttributeOverride(name = "width", column = @Column(name =
"thumbnail_width")),
@AttributeOverride(name = "length", column = @Column(name =
"thumbnail_length")),
@AttributeOverride(name = "contents", column = @Column(name =
"thumbnail_contents"))
})
private ImageData thumbnail;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "height", column = @Column(name =
"image_height")),
@AttributeOverride(name = "width", column = @Column(name =
"image_width")),
@AttributeOverride(name = "length", column = @Column(name =
"image_length")),
@AttributeOverride(name = "contents", column = @Column(name =
"image_contents", columnDefinition = "mediumblob"))
})
private ImageData image;
...
}
@Embeddable
public class ImageData {
@Basic(optional = false)
private Integer height;
@Basic(optional = false)
private Integer width;
@Basic(optional = false)
private Integer length;
@Lob
@Persistent(optional = false, fetch = FetchType.LAZY)
private InputStream contents;
...
}
Can anybody help?