2015-12-12 54 views
0

我使用:Hibernate的DDL錯誤@JoinTable主鍵與@OrderColumn

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>4.3.10.Final</version> 
    <scope>provided</scope> 
</dependency> 

,我有這樣的實體:

@Entity 
public class Person extends Subject 
{ 
    ... 

    @ManyToMany 
    @JoinTable(name = "PERSON_ACCOUNT", joinColumns = @JoinColumn(name = "PERSON_ID") , inverseJoinColumns = @JoinColumn(name = "ACCOUNT_ID")) 
    @OrderColumn(name = "PERSON_ORDER") 
    private List<Account> accountList = new ArrayList<>(); 

    ... 
} 

和Hibernate生成此SQL:

create table PERSON_ACCOUNT (PERSON_ID bigint not null, ACCOUNT_ID bigint not null, PERSON_ORDER integer not null, primary key (PERSON_ID, PERSON_ORDER)) ENGINE=InnoDB 

但是,IMO,PK是不正確的。
PK應該是:

primary key (PERSON_ID, ACCOUNT_ID) 

這是一個bug(EclipseLink的生成正確PK)?

有沒有辦法(或解決方法)讓Hibernate生成正確的PK?

請注意,我不想在我自己的上生成DDL。

感謝

+0

爲什麼連接表*不包含訂單的PK?一個列表可以有一個元素的重複。 –

+0

沒錯,但我不想重複PERSON_ID,ACCOUNT_ID。也許它應該是'主鍵(PERSON_ID,ACCOUNT_ID,PERSON_ORDER)'? –

+0

或者我應該添加一個獨特的限制條件。 –

回答

1

連接表的使用順序列列表的PK應該始終有PERSON_ORDER作爲PK的一部分,因爲一個列表應該允許的DUP。

如果你不想重複PERSON_ID, ACCOUNT_ID連擊,那麼你不使用列表,允許的DUP ...即選擇一個列表實現,不允許他們(的SortedSet?),或做你說有獨特的約束(但只有持久效果,所以可能不是最有效的)。

這是不正確的說的EclipseLink產生正確的PK,因爲這是完全錯誤的......這是禁止的DUP,所以無用的最列表(即使該字段是一個列表)。

+0

謝謝,現在我承擔了這個問題。但*集*(LinkedHashSet)不允許與* @ OrderColumn *,我想我會同時使用自定義列表和唯一約束。 –

+0

是的,自定義列表可能是最好的 –