0

私には2つのクラスがあります:

@Entity
@Table(name="a_table")
@Inheritance(strategy= InheritanceType.JOINED)
@DiscriminatorColumn(name="jdoclass", length=255)
public abstract class A {
  @Id
  @Column(name="id")
  private int id;

  @Column(name="other_id")
  private int otherID;

  public A(){
  }
  ...
}

@Entity
@Table(name="b_table", uniqueConstraints = @UniqueConstraint(columnNames = {"other_id", "different_id"}))
public class B extends A {
  @Column(name="other_id")
  private int otherID;

  @Column(name="different_id")
  private int differentID;

  public B() {
  }
  ...
}

EclipseLinkがSQLを作成するとき、クラスBからotherIDフィールドを省略し、そのフィールドの列をDBに作成しません。クラスBで列名を変更しても、列が作成されません。

それはかなり理解できます-同じフィールドが親クラスに存在します。
しかし、いくつかの理由で、この列を作成する必要があります(そのうちの1つは、UniqueConstraintテーブルに配置する必要があることです)。

1つの解決策を見つけました。クラスBの「otherID」フィールド名を変更します。そうすると、列が正しく作成されます。ただし、このフィールドの名前を変更することは避けたいので、このソリューションを最終的なソリューションとして脅かします。

この列を強制的に作成する他の解決策はありますか?

4

1 に答える 1

0

使用する場合は、データベースInheritanceType.JOINEDを確認してください。PrimaryKeyJoinColumnのテーブルと列を確認してentityくださいdatabase。以下のようにしてみてください。

Person.java

    @Entity
    @Table(name="PERSON")
    @Inheritance(strategy = InheritanceType.JOINED)
    @DiscriminatorColumn(name = "Person_Type")
    public abstract class Person {
        @Id
        @Column(name = "ID")
        private int id;
        @Column(name = "NAME")
        private String name;

        public Person() {
        }

        //getter and setter
    }

Student.java

    @Entity
    @Table(name = "STUDENT")
    @PrimaryKeyJoinColumn(name = "ID", referencedColumnName = "ID")
    public class Student extends Person {
        @Column(name = "ROLE_NO")
        private String rollNo;
        @Column(name = "COURSE")
        private String course;

        public Student() {
        }

        public Student(String name, String rollNo, String course) {
            super(name);
            this.rollNo = rollNo;
            this.course = course;

        }
        // getter and setter
    }
于 2012-09-26T13:54:56.333 に答える