[
https://issues.apache.org/jira/browse/OPENJPA-3073?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18141867#comment-18141867
]
ASF subversion and git services commented on OPENJPA-3073:
----------------------------------------------------------
Commit 7dfe1cb96984a36840ee67b92e34337b06e0d367 in openjpa's branch
refs/heads/OPENJPA-3073 from Richard Zowalla
[ https://gitbox.apache.org/repos/asf?p=openjpa.git;h=7dfe1cb96 ]
[OPENJPA-3073] Document the mapping of auto-apply converted attributes that are
not serializable
Describe the new column, the exceptions, the need to list the converter
for runtime and build-time enhancement, and the MapAutoApplyConvertedFields
option in the migration considerations, and add an Upgrade Notes section to
the release notes.
> Attribute of a non-Serializable type converted only by an autoApply converter
> is silently left out of the mapping
> -----------------------------------------------------------------------------------------------------------------
>
> Key: OPENJPA-3073
> URL: https://issues.apache.org/jira/browse/OPENJPA-3073
> Project: OpenJPA
> Issue Type: Bug
> Reporter: Richard Zowalla
> Assignee: Richard Zowalla
> Priority: Major
> Fix For: 4.2.0
>
>
> Description:
> An entity or embeddable attribute whose type does not implement
> java.io.Serializable (for example a final value class or a record) and that
> has no mapping annotation is not persisted, even though a
> @Converter(autoApply = true) AttributeConverter<X, Y> is registered for its
> type. OpenJPA only logs 'Fields "..." are not a default persistent type, and
> do not have any annotations indicating their persistence strategy. They will
> be treated as non-persistent.' The attribute gets no column, its value is
> lost on persist, JPQL that references it fails with 'No field named "..."',
> and the metamodel has no such attribute. If the attribute is declared @Basic
> instead, the persistence unit fails with 'The type of field "..." isn't
> supported by declared persistence strategy "Basic"'.
>
> Example:
> public record Weight(long grams) \{ }
> @Converter(autoApply = true)
> public class WeightConverter implements AttributeConverter<Weight, Long> \{
> ... }
> @Entity public class Parcel \{ @Id long id; Weight weight; } // weight is
> never stored
>
> Jakarta Persistence 3.2, section 3.9: "A converted attribute is considered a
> basic attribute, since, with the aid of the converter, its values can be
> represented as instances of a basic type" and "If the value of the autoApply
> element of the Converter annotation is true, the converter is automatically
> applied to all attributes of the target type".
>
> Cause:
> PersistenceMetaDataDefaults.getPersistenceStrategy()/isDefaultPersistent()
> decide whether an unannotated attribute is persistent without looking at the
> auto-apply converter registry of the MetaDataRepository. They only accept
> basic types, enums, embeddables, Serializable types and an explicit @Convert.
> The registry is only used later, in FieldMetaData.resolve(), and only for
> fields that are already persistent.
> AnnotationPersistenceMetaDataParser.parseBasic() likewise rejects @Basic on
> such a type.
>
> Fix: such an attribute becomes a basic attribute mapped through its
> auto-apply converter, with a column of the converter's database type. This
> applies to field and property access and inside embeddables. Identifier,
> version, @Enumerated and @Temporal attributes and attributes with their own
> @Convert (including disableConversion = true) are excluded, as the
> specification requires. An attribute of such a type without any converter is
> still left out with a warning.
>
> Upgrade
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)