2014-02-25 35 views
1

我在使用MySql數據庫的JBOSS服務器上運行的JEE6項目中使用Hibernate作爲我的ORM。 在我的每個Data元素的項目中都會有細節元素。爲此,我創建了一個與共享主鍵的雙向一對一關係,如下所示。在@OnetoOne共享主鍵場景中更改生成的Hibernate外鍵

@Entity 
    @Table(name="DATA", schema = "TEST") 
    public class Data implements Serializable { 
    .... 
    ..... 
    @OneToOne(fetch = FetchType.LAZY, mappedBy = "data", cascade = CascadeType.ALL) 
     public Details getDetails() { 
      return details; 
    .... 
    } 


@Entity 
@Table(name = "DETAILS", schema = "TEST") 
public class Details implements Serializable { 
... 
... 
@GenericGenerator(name = "generator", strategy = "foreign", parameters = { @org.hibernate.annotations.Parameter(name = "property", value = "data") }) 
    @Id 
    @GeneratedValue(generator = "generator") 
    @Column(name = "DETAILS_ID", nullable=false) 
    @Index(name="DETAILS_ID") 
    @ForeignKey(name = "FK_DATA_ID") 
    public Long getDetailsId() { 
     return detailsId; 
    } 

    @OneToOne 
    @PrimaryKeyJoinColumn(name = "DETAILS_ID", referencedColumnName = "DATA_ID") 
    public Data getData() { 
     return data; 
    } 
... 
} 

即使提@ForeignKey它會產生像下面

alter table TEST.DETAILS add constraint FK9FDD7BA22964C454 foreign key (DETAILS_ID) references TEST.DATA 

如何創建在這種情況下乾淨的外鍵約束醜陋的外鍵約束後?我需要創建一個名爲'FK_DATA_ID'的外鍵約束。

回答

3

@ForeignKey具有財產inverseName您可以用在這裏,因爲每個文檔

inverseName引用到另一側約束,

所以你可以使用@ForeignKey(name = "FK_DATA_ID", inverseName = "FK_DATA_INVRS_ID") 這裏是link

更新:

似乎有休眠的bug,這裏是link。由Hibernate 4.3.1版本,這是解決

此外,他們棄用org.hibernate.annotations.ForeignKey你需要使用新的javax.persistence.ForeignKey

+0

你的鏈接顯示它是一個JEE7實現。我正在使用JEE6,Hibernate確實爲@ForeignKey提供了一個註釋,並將inverName作爲一個屬性,但即使這樣也行不通。它仍然會產生醜陋的Hibernate Constraint。 – Sabarish

+0

您使用的是哪個版本的hibernate? – Yogesh

+0

我使用JBOSS AS 7.0提供的hibernate 4.0。測試版本 – Sabarish

1

我曾與JOINED繼承表類似的問題。嘗試使用已棄用的@ org.hibernate.annotations.ForeignKey註釋。在許多地方,它仍然(休眠4.3.8)比javax.persistence包中的更好。

那麼現代javax.persistence.ForeignKey不工作,我的建議是結合棄用org.hibernate.annotations.ForeignKey留下有用的評論用它旁邊:

// TODO remove when modern approach works as intended