我假设您正在使用休眠,因为您在此问题的标签中拥有它。这是休眠中的错误/缺失功能:
https://hibernate.onjira.com/browse/HB-1245
当方言支持在与 create table 相同的语句中创建约束时,它将简单地忽略唯一约束名称。我检查了 SqlServer 和 Oracle 方言,它们都支持这种创建约束的方式,这将导致您遇到的错误。
有两种方法可以解决此错误:
1.快捷方式:
只要扩展方言,方法返回falsesupportsUniqueConstraintInCreateAlterTable()
即可:
public static class SQLServerDialectImproved extends SQLServerDialect {
@Override
public boolean supportsUniqueConstraintInCreateAlterTable() {
return false;
}
}
并将此类设置为hibernate.dialect
持久单元配置 ( persistence.xml
) 的属性中的方言。
2.正确的方法:
修复hibernate代码并重新编译:
bug在org.hibernate.mapping.UniqueKey
class,方法sqlConstraintString()
会返回unique (TAG_NAME, USERS_ID)
所有的方言,即使他们支持constraint UQ_TAG_USER unique (TAG_NAME, USERS_ID)
.
但这可能是一个更大的变化(需要支持各种方言等)
幕后:
如果使用原始方言,将导致执行以下 sql 语句来创建表(添加 id 列):
create table TAG (
id bigint not null,
TAG_NAME varchar(255),
USERS_ID varchar(255),
primary key (id),
unique (TAG_NAME, USERS_ID)
)
在您按照第一个选项中所述应用修复后,将执行以下 sql 语句:
create table TAG (
id numeric(19,0) not null,
TAG_NAME varchar(255),
USERS_ID varchar(255),
primary key (id)
)
create unique index UQ_TAG_USER on TAG (TAG_NAME, USERS_ID)
其中包括在单独的语句中创建具有所选名称 (UQ_TAG_USER) 的唯一约束。