如何强制EclipseLink在InheritanceType.JOINED策略中为子类创建列?

时间:2012-09-26 11:36:23

标签: inheritance jpa eclipselink

我有两个班级:

@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类中更改列名,仍然不会创建列。

这是可以理解的 - 父类中存在相同的字段 但由于某些原因,我真的需要创建这个列(其中一个是我需要将它放在UniqueConstraint表中)。

我找到了一个解决方案:在B类中更改“otherID”字段名称。然后正确创建列。但我想避免更改此字段的名称,我将此解决方案作为最终解决方案。

是否有其他解决方案可以强制创建此列?

1 个答案:

答案 0 :(得分:0)

如果您使用InheritanceType.JOINED,请确保PrimaryKeyJoinColumn与数据库一致。 确保entity的表格和columen与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
    }