2014-10-28 64 views
0

我有一個小問題,我有一個超類定義一個實體到PostgreSQL中的根表。Hibernate沒有使用@JoinTable的名稱參數

這個類有2個繼承表/類實體,在這裏我想添加一個@OneToOne連接表的關聯:

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@Table(name = "equipement") 
public abstract class Equipement 
{ 
    .... 
} 

@Entity 
@Table(name = "nod") 
public class Nod extends Equipement 
{ 
    protected Cross cross; 

    @OneToOne(cascade = CascadeType.ALL, optional = true, fetch = FetchType.EAGER) 
    @JoinTable(name = "assoc_nod_cross", joinColumns = @JoinColumn(name = "nod_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "cross_id", referencedColumnName = "id")) 
    public Cross getCross() 
    { 
     return cross; 
    } 

    ... 
} 

@Entity 
@Table(name = "cross") 
public class Cross extends Equipement 
{ 
    protected Nod nod; 

    @OneToOne(cascade = CascadeType.ALL, optional = true, fetch = FetchType.EAGER) 
    @JoinTable(name = "assoc_nod_cross", joinColumns = @JoinColumn(name = "cross_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "nod_id", referencedColumnName = "id")) 
    public Nod getNod() 
    { 
     return nod; 
    } 

    ... 
} 

當列表中的所有點頭或交叉實體,休眠要搜索在該inverseJoinColumns場錯誤的表,它不使用名稱(assoc_nod_cross),我什至可以放任何東西。

樣品:

Hibernate: select cross0_.id as id1_7_, cross0_.nod_id as nod_id2_1_ from cross cross0_ 

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
... 
Caused by: org.postgresql.util.PSQLException: ERROR: column cross0_.node_id does not exist 

是不是因爲@Inheritance戰略的問題?它是休眠的bug嗎?這是我的實體定義中的問題嗎?

增加的信息:我試着切換到EclipseLink來檢查它是否是一個休眠錯誤/限制,或者如果我在某處錯了。 EclipseLink工作良好。

回答

0

這是CrossNod之間的雙向關係嗎?如果是這樣,你不必用這種方式來註釋關係的兩邊。這可能會導致混淆休眠。 Here是它工作的一個例子。我認爲這應該這樣做

@Entity 
@Table(name = "nod") 
public class Nod extends Equipement 
{ 
    protected Cross cross; 

    @OneToOne(cascade = CascadeType.ALL, optional = true, fetch = FetchType.EAGER) 
    @JoinTable(name = "assoc_nod_cross", joinColumns = @JoinColumn(name = "nod_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "cross_id", referencedColumnName = "id")) 
    public Cross getCross() 
    { 
     return cross; 
    } 

    ... 
} 

@Entity 
@Table(name = "cross") 
public class Cross extends Equipement 
{ 
    protected Nod nod; 

    @OneToOne(mappedBy = "cross") 
    public Nod getNod() 
    { 
     return nod; 
    } 

    ... 
} 
+0

我正在考慮這樣的問題,但即使沒有Cross實體上的JoinTable註釋,也存在相同的錯誤。 – 2014-10-28 15:32:29

+0

即使使用'mappedBy =「cross」'? – 2014-10-28 15:37:26

+0

是的,我改變了它,並保留它,因爲它顯然更好。但它繼續在我身上。 – 2014-10-28 15:42:56