2015-12-12 55 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

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