OpenJPA
  1. OpenJPA
  2. OPENJPA-2083

Unmapped fields silently treated as transient

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 2.1.1
    • Fix Version/s: 2.2.0
    • Component/s: jpa
    • Labels:
      None
    • Patch Info:
      Patch Available

      Description

      The JPA 2.0 spec requires any non-static non-transient entity field to be persistent unless explicitly mapped as transient by a @Transient annotation or the equivalent XML.

      OpenJPA 2.1.1 silently treats some unmapped non-primitive fields as transient instead of throwing an exception or at least logging a warning.

      Example:

      @Entity
      public class City

      { @Id private String name; private Integer population; private java.util.concurrent.Executor executor; // getters and setters }
      1. OPENJPA-2083.patch
        2 kB
        Jacob Nowosatka

        Activity

        Hide
        Albert Lee added a comment -

        Close issue in preparation for 2.2.0 release.

        Show
        Albert Lee added a comment - Close issue in preparation for 2.2.0 release.
        Hide
        Donald Woods added a comment -

        Committed revision 1226910.

        Show
        Donald Woods added a comment - Committed revision 1226910.
        Hide
        Jacob Nowosatka added a comment -

        Patch adds a warning message when dealing with unmapped non-primitive fields stating that "the fields are not default persistent and do not have any annotations. and will be treated as non-persistent. If they fields should be persistent, annotate them with the appropriately. Otherwise, mark them as transient."

        Show
        Jacob Nowosatka added a comment - Patch adds a warning message when dealing with unmapped non-primitive fields stating that "the fields are not default persistent and do not have any annotations. and will be treated as non-persistent. If they fields should be persistent, annotate them with the appropriately. Otherwise, mark them as transient."
        Hide
        Kevin Sutter added a comment -

        I think a warning message would be an excellent first step. At least it would highlight to users that OpenJPA may not be doing the processing that you are expecting (or vice versa). This could still potentially be raised as a spec violation, but that's splitting hairs in my opinion. So, let's highlight the processing with a warning message and say we're done.

        Show
        Kevin Sutter added a comment - I think a warning message would be an excellent first step. At least it would highlight to users that OpenJPA may not be doing the processing that you are expecting (or vice versa). This could still potentially be raised as a spec violation, but that's splitting hairs in my opinion. So, let's highlight the processing with a warning message and say we're done.
        Hide
        Rick Curtis added a comment -

        Kevin / Harold -

        Thoughts on the correct 'fix' for this issue? I'm leaning toward a warning message...

        Thanks,
        Rick

        Show
        Rick Curtis added a comment - Kevin / Harold - Thoughts on the correct 'fix' for this issue? I'm leaning toward a warning message... Thanks, Rick
        Hide
        Kevin Sutter added a comment -

        FYI, the OpenJPA manual documents slightly different behavior:

        "2.14. Persistent Field Defaults

        In the absence of any of the annotations above, JPA defines the following default behavior for declared fields:

        o Fields declared static, transient, or final default to non-persistent.

        o Fields of any primitive type, primitive wrapper type, java.lang.String, byte[], Byte[], char[], Character[], java.math.BigDecimal, java.math.BigInteger, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Timestamp, or any Serializable type default to persistent, as if annotated with @Basic.

        o Fields of an embeddable type default to persistent, as if annotated with @Embedded.

        o All other fields default to non-persistent.

        Note that according to these defaults, all relations between entities must be annotated explicitly. Without an annotation, a relation field will default to serialized storage if the related entity type is serializable, or will default to being non-persistent if not."

        At least this explains the OpenJPA behavior. But, now we have to resolve this behavior against the JPA spec-defined behavior...

        Show
        Kevin Sutter added a comment - FYI, the OpenJPA manual documents slightly different behavior: "2.14. Persistent Field Defaults In the absence of any of the annotations above, JPA defines the following default behavior for declared fields: o Fields declared static, transient, or final default to non-persistent. o Fields of any primitive type, primitive wrapper type, java.lang.String, byte[], Byte[], char[], Character[], java.math.BigDecimal, java.math.BigInteger, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Timestamp, or any Serializable type default to persistent, as if annotated with @Basic. o Fields of an embeddable type default to persistent, as if annotated with @Embedded. o All other fields default to non-persistent. Note that according to these defaults, all relations between entities must be annotated explicitly. Without an annotation, a relation field will default to serialized storage if the related entity type is serializable, or will default to being non-persistent if not." At least this explains the OpenJPA behavior. But, now we have to resolve this behavior against the JPA spec-defined behavior...

          People

          • Assignee:
            Donald Woods
            Reporter:
            Harald Wellmann
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development