我使用的是:
<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。
感谢
使用顺序列的列表的联接表的PK应始终将PERSON_ORDER
作为PK的一部分,因为List应允许重复。
如果你不想要重复的PERSON_ID, ACCOUNT_ID
组合,那么你就不会使用允许重复的列表。。。即,选择一个不允许它们的List实现(SortedSet?),或者按照您所说的使用唯一约束(但这只在持久化时生效,因此可能不是最有效的)。
说EclipseLink生成正确的PK是不正确的,因为这是完全错误的。。。它禁止重复,因此对于大多数列表(即使该字段是列表)来说毫无用处。