使用@OrderColumn Hibernate DDL错误的@JoinTable主键

时间:2015-12-12 11:01:57

标签: hibernate jpa hibernate-mapping

我正在使用:

<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)

这是一个错误(EclipseLink生成正确的PK)吗?

有没有办法(或解决方法)让Hibernate生成正确的PK?

请注意我不想自己生成DDL

由于

1 个答案:

答案 0 :(得分:1)

使用订单列的List的连接表的PK应始终具有PERSON_ORDER作为PK的一部分,因为 List 应允许重复。

如果您不想要重复的PERSON_ID, ACCOUNT_ID组合,那么您不会使用允许重复的列表...即选择不允许它们的列表实现(< em> SortedSet ?)或者如你所说的那样使用唯一约束(但这只会在持久化时生效,所以可能效率不高)。

说EclipseLink生成正确的PK是不正确的,因为它完全错误......它禁止重复,因此对大多数列表无用(即使该字段是List)