如何强制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促进私有字段的封装。它们的名称可以与访问器方法使用的名称不同。甚至可能根本就没有磁场。