OpenJPA
  1. OpenJPA
  2. OPENJPA-578

Specifying a default for VersionStrategy in persistence.xml has no effect when a version field is present in the entity class.

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.0.2
    • Fix Version/s: 1.2.0
    • Component/s: jdbc
    • Labels:
      None

      Description

      Specifying a default for VersionStrategy in persistence.xml has no effect when a version field is present in the entity class.

      According the OpenJPA documentation the following property should override the default value of VersionStrategy and the specified RowChangeTimestampStrategy should be applied for all entity classes.

      <property name="openjpa.jdbc.MappingDefaults"
      value="jpa(VersionStrategy=com.ibm.websphere.persistence.RowChangeTimestampStrategy)" />

      JPA accepts this property but then it has no effect on Entity mappings if the version field is present.

      import javax.persistence.*;
      import org.apache.openjpa.persistence.jdbc.VersionStrategy;

      @Entity
      public class EntityA {
      @Id int id;
      String name;
      double amt;
      @Version java.sql.Timestamp lastUpdate;

      For EntityA, the version strategy should be RowChangeTimestampStrategy. Instead, the NumberVersionStrategy is adopted.
      If the @Version is removed from EntityA, the version strategy becomes RowChangeTimestampStrategy.

        Activity

        Hide
        Fay Wang added a comment -

        The attached patch fixes this problem.

        Show
        Fay Wang added a comment - The attached patch fixes this problem.
        Hide
        Fay Wang added a comment -

        There is a typo in this example:
        "Instead, the NumberVersionStrategy is adopted. " should be changed to
        "Instead, the TimestampVersionStrategy is adopted." See below:

        @Entity
        public class EntityA {
        @Id int id;
        String name;
        double amt;
        @Version java.sql.Timestamp lastUpdate;

        For EntityA, the version strategy should be RowChangeTimestampStrategy. Instead, the TimestampVersionStrategy is adopted.
        If the @Version is removed from EntityA, the version strategy becomes RowChangeTimestampStrategy.

        Show
        Fay Wang added a comment - There is a typo in this example: "Instead, the NumberVersionStrategy is adopted. " should be changed to "Instead, the TimestampVersionStrategy is adopted." See below: @Entity public class EntityA { @Id int id; String name; double amt; @Version java.sql.Timestamp lastUpdate; For EntityA, the version strategy should be RowChangeTimestampStrategy. Instead, the TimestampVersionStrategy is adopted. If the @Version is removed from EntityA, the version strategy becomes RowChangeTimestampStrategy.
        Hide
        Fay Wang added a comment -

        It looks that the current behavior is working as design:

        The openjpa.jdbc.MappingDefaults configuration property controls the MappingDefaults interface implementation in use. This is a plugin property (see Section 4, " Plugin Configuration "), so you can substitute your own implementation or configure the existing ones. OpenJPA includes the following standard implementations:
        <snip>
        default: This is an alias for the org.apache.openjpa.jdbc.meta.MappingDefaultsImpl class. This default implementation is highly configurable. It has the following properties:
        <snip>
        VersionStrategy: The default version strategy for classes without a version field. You can specify a builtin strategy alias or the full class name of a custom version strategy. You can also use OpenJPA's plugin format (see Section 4, " Plugin Configuration ") to pass arguments to the strategy instance. Common strategies are none, state-comparison, timestamp, and version-number, the default. See the org.apache.openjpa.jdbc.meta.strats package for all available strategies.

        Show
        Fay Wang added a comment - It looks that the current behavior is working as design: The openjpa.jdbc.MappingDefaults configuration property controls the MappingDefaults interface implementation in use. This is a plugin property (see Section 4, " Plugin Configuration "), so you can substitute your own implementation or configure the existing ones. OpenJPA includes the following standard implementations: <snip> default: This is an alias for the org.apache.openjpa.jdbc.meta.MappingDefaultsImpl class. This default implementation is highly configurable. It has the following properties: <snip> VersionStrategy: The default version strategy for classes without a version field. You can specify a builtin strategy alias or the full class name of a custom version strategy. You can also use OpenJPA's plugin format (see Section 4, " Plugin Configuration ") to pass arguments to the strategy instance. Common strategies are none, state-comparison, timestamp, and version-number, the default. See the org.apache.openjpa.jdbc.meta.strats package for all available strategies.
        Hide
        Fay Wang added a comment -

        We found a workaround to overwrite the current behavior without any openjpa change.

        Show
        Fay Wang added a comment - We found a workaround to overwrite the current behavior without any openjpa change.

          People

          • Assignee:
            Unassigned
            Reporter:
            Fay Wang
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development