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

如何强制EclipseLink为InheritanceType.JOINED策略中的子类创建列?,inheritance,jpa,eclipselink,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 ot

我有两门课:

@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”字段名,然后正确创建列。但我希望避免更改此字段的名称,并威胁将此解决方案作为最终解决方案


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

如果使用
InheritanceType.JOINED
请确保
PrimaryKeyJoinColumn
与数据库一起使用。 使用
数据库
确保
实体
的表和列。 尝试如下

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
    }

我肯定会使用另一个字段名,因为这个字段对超类隐藏了字段。如何创建搜索
a.otherID
B.otherID
的JPQL查询?假设我不想搜索otherID。此外,它为OpenJPA工作。现在我想让它在EclipseLink中工作:)如果你不想搜索它,那么这个字段在类外是完全不可见的。所以它的名字不重要。这只是一个私人领域。你们为什么这么关心?我负责这个已经和OpenJPA合作过的大型项目的过渡,将来应该和EclipseLink合作。Providen代码只是一个示例——有很多类和子类都有这种情况,所以我想避免更改字段的名称。第二件事是,若我更改了字段名,那个么setter和getter的名称也应该更改(以满足JavaBean标准)。但这是不可能的,因为这个字段的setter和getter必须重写父字段的setter和getter。恰恰相反。JavaBeans促进私有字段的封装。它们的名称可以与访问器方法使用的名称不同。甚至可能根本就没有磁场。