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

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

          People

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

            Dates

            • Created:
              Updated:
              Resolved:

              Development