OpenJPA
  1. OpenJPA
  2. OPENJPA-2255

Couldn't load the referencedColumn definition when create the JoinTable

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 2.1.1
    • Fix Version/s: 2.3.0
    • Component/s: jpa

      Description

      The JoinColumn couldn't have the referencedColumn's definition which includes the length definition. and it's length should be assigned to the default value 255.

      @Entity
      public class Student {
      @Id @Column(name="id", length=128, nullable=false) private String id;
      @Column(name="sName", length=255) private String sName;
      @ManyToMany
      @JoinTable(
      name="student_course_map",
      joinColumns=

      {@JoinColumn(name="student_id", referencedColumnName="id", nullable=false)}

      ,
      inverseJoinColumns=

      {@JoinColumn(name="course_id", referencedColumnName="id", nullable=false)}


      )
      public Collection getCourses()

      ...
      }

      @Entity
      public class Courses

      { @Id @Column(name="id", length=128, nullable=false) private String id; @Column(name="cName", length=255) private String cName; ... }

      We can see the student id length has been defined to 128. And there is no definition length in the JoinColumn student_id. The JoinColumn should be set to the default value 255.

      The warning message will occur like this

      WARN [Schema] Existing column "student_id" on table "test.student_course_map" is incompatible with the same column in the given schema definition. Existing column:
      Full Name: student_course_map.student_id
      Type: varchar
      Size: 128
      Default: null
      Not Null: true
      Given column:
      Full Name: student_course_map.student_id
      Type: varchar
      Size: 255
      Default: null
      Not Null: true

        Activity

        xiezhi created issue -
        Albert Lee made changes -
        Field Original Value New Value
        Attachment OPENJPA-2255.patch [ 12543347 ]
        Hide
        Albert Lee added a comment -

        This problem only happens when

        • @JoinTable is specified in the entity.
        • String type entity identity field
        • database table is created with join column id with length other than the database specific column length.

        This problem also affects the Mapping tool creating database table operation, always assume database defect VARCHAR/CHAR length define in the database dictionary.

        Attached a patch for trunk. Please try if this has resolved your issue.

        For fix/commit for 2.2.x, 2.1.x and 2.0.x releases, you will need to work with IBM service channel to get this fix in these releases.

        Albert Lee.

        Show
        Albert Lee added a comment - This problem only happens when @JoinTable is specified in the entity. String type entity identity field database table is created with join column id with length other than the database specific column length. This problem also affects the Mapping tool creating database table operation, always assume database defect VARCHAR/CHAR length define in the database dictionary. Attached a patch for trunk. Please try if this has resolved your issue. For fix/commit for 2.2.x, 2.1.x and 2.0.x releases, you will need to work with IBM service channel to get this fix in these releases. Albert Lee.
        Hide
        xiezhi added a comment -

        Thanks,Albert. I got your patch, and apply it into my server (geronimo-tomcat7-javaee6-3.0.0), The warning message mentioned in the jira did disappear, but another message occurred. Same message, same problem. But the difference is the column is defined in ManyToOne annotation.

        The source is below.

        @ManyToOne(optional=true, cascade=

        {CascadeType.PERSIST, CascadeType.MERGE}

        ) @JoinColumn(name="classField") private Location schoolField;

        The message is below.

        2012-09-05 09:19:58,293 WARN [Schema] Existing column "classField" on table "test.classField" is incompatible with the same column in the
        given schema definition. Existing column:
        Full Name: classes.classField
        Type: varchar
        Size: 255
        Default: null
        Not Null: false
        Given column:
        Full Name: classes.classField
        Type: varchar
        Size: 128
        Default: null
        Not Null: false

        Show
        xiezhi added a comment - Thanks,Albert. I got your patch, and apply it into my server (geronimo-tomcat7-javaee6-3.0.0), The warning message mentioned in the jira did disappear, but another message occurred. Same message, same problem. But the difference is the column is defined in ManyToOne annotation. The source is below. @ManyToOne(optional=true, cascade= {CascadeType.PERSIST, CascadeType.MERGE} ) @JoinColumn(name="classField") private Location schoolField; The message is below. 2012-09-05 09:19:58,293 WARN [Schema] Existing column "classField" on table "test.classField" is incompatible with the same column in the given schema definition. Existing column: Full Name: classes.classField Type: varchar Size: 255 Default: null Not Null: false Given column: Full Name: classes.classField Type: varchar Size: 128 Default: null Not Null: false
        Albert Lee made changes -
        Assignee Albert Lee [ allee8285 ]
        Hide
        Albert Lee added a comment -

        XieZhi,

        Can you provide a more concrete test case and the conditions reproducing the failure?

        Show
        Albert Lee added a comment - XieZhi, Can you provide a more concrete test case and the conditions reproducing the failure?
        Hide
        Albert Lee added a comment -

        I don't think the new message is in error.

        What the message saying is the classField in the database has column length 255 and whereas the id field of the @OneToMany side has column length 128. This means OpenJPA recognized the length=128 set on the id field. Before the patch, join column did not pick up the id column length and defaulted to 255, therefore this message did not happened. Either the id column has to match the join column length or the join column length need to match the id length.

        This is just the reverse of the original scenario.

        Albert Lee.

        Show
        Albert Lee added a comment - I don't think the new message is in error. What the message saying is the classField in the database has column length 255 and whereas the id field of the @OneToMany side has column length 128. This means OpenJPA recognized the length=128 set on the id field. Before the patch, join column did not pick up the id column length and defaulted to 255, therefore this message did not happened. Either the id column has to match the join column length or the join column length need to match the id length. This is just the reverse of the original scenario. Albert Lee.
        Albert Lee made changes -
        Fix Version/s 2.3.0 [ 12319463 ]
        Albert Lee made changes -
        Status Open [ 1 ] Resolved [ 5 ]
        Resolution Fixed [ 1 ]
        Mark Struberg made changes -
        Status Resolved [ 5 ] Closed [ 6 ]
        Transition Time In Source Status Execution Times Last Executer Last Execution Date
        Open Open Resolved Resolved
        11d 14h 1 Albert Lee 11/Sep/12 15:16
        Resolved Resolved Closed Closed
        998d 6h 3m 1 Mark Struberg 06/Jun/15 21:19

          People

          • Assignee:
            Albert Lee
            Reporter:
            xiezhi
          • Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development