[ 
https://issues.apache.org/jira/browse/OPENJPA-3073?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18141866#comment-18141866
 ] 

ASF subversion and git services commented on OPENJPA-3073:
----------------------------------------------------------

Commit f000546be0911f541e63bfa5cdd3f03816fb56b1 in openjpa's branch 
refs/heads/OPENJPA-3073 from Richard Zowalla
[ https://gitbox.apache.org/repos/asf?p=openjpa.git;h=f000546be ]

[OPENJPA-3073] Map an attribute that only an auto-apply converter makes basic

An attribute without a mapping annotation was persistent by default only
if its type was a basic type, an embeddable or serializable. An attribute
of a value class or record that does not implement Serializable got no
persistence strategy, so PersistenceMetaDataDefaults left it out of the
mapping with only a warning - even when a @Converter(autoApply = true) was
registered for its type - and its value was never stored. Declaring it
@Basic failed with "isn't supported by declared persistence strategy".

Jakarta Persistence 3.2 section 3.9 considers a converted attribute a
basic attribute and applies an auto-apply converter to all attributes of
its target type. getPersistenceStrategy() and isDefaultPersistent() now
consult the auto-apply registry of the MetaDataRepository, which
PersistenceMetaDataFactory.load() fills before any class is parsed, and
parseBasic() accepts such an attribute instead of asking for
serialization. Identifier, version, enumerated and temporal attributes
and attributes with a @Convert of their own, including
@Convert(disableConversion = true), are left alone, as is an attribute of
such a type without any converter.

The attribute gets a new column of the converter's database type on
upgrade, so openjpa.Compatibility=MapAutoApplyConvertedFields=false
restores the 4.1.x mapping of unannotated attributes. @Basic attributes
are converted either way, since 4.1.x rejected them.

The test entities are enhanced at runtime: the build-time enhancer of the
test module sees no persistence unit and therefore no auto-apply
converter, and an enhanced class keeps the fields it was enhanced with.
For the same reason TestEnhancementWithMultiplePUs skips the @Basic test
entity.


> 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)

Reply via email to