2012-09-26 38 views
0

我有兩個類:如何強制EclipseLink爲InheritanceType.JOINED策略中的子類創建列?

@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」字段名稱。然後列創建正確。但我想避免更改此字段的名稱,並將此解決方案視爲最終解決方案。

是否有其他解決方案來強制創建此列?

+0

我肯定會使用另一個字段名,因爲這一個從超隱藏的領域。你將如何創建一個JPQL查詢來搜索'A.otherID'或'B.otherID'? –

+0

可以說我不想搜索otherID。此外,它爲OpenJPA工作。現在我想讓它在EclipseLink中工作:) – pzak

+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 
    } 
相關問題