name
的{{1}}属性似乎没有效果。
@UniqueConstraint
我正在@Entity
@Table(name = "TAG", uniqueConstraints = @UniqueConstraint(columnNames = {
"TAG_NAME", "USERS_ID" }, name="UQ_TAG_USER"))
public class Tag extends BaseEntity {
}
,SQL Server 2008
与JPA 2.0
一起使用。
在数据库端,创建了一个索引Hibernate 3.6
,而不是UQ__TAG__6EF57B66
。
我错过了什么?有没有办法从java方面强制执行给定的名称?一个人必须求助于编辑架构文件?我们是一家没有DBA的小商店,我试图在hibernate架构设施的帮助下尽我所能。
答案 0 :(得分:3)
我假设你正在使用hibernate,因为你在这个问题的标签中有它。这是hibernate中的错误/缺失功能:
https://hibernate.onjira.com/browse/HB-1245
当方言支持在与create table相同的语句中创建约束时,它将忽略唯一约束名称。 我检查了SqlServer和Oracle方言,他们都支持这种创建约束的方式,这将导致你遇到的错误。
有两种方法可以解决此错误:
<强> 1。快捷方式:
只需扩展方言并为supportsUniqueConstraintInCreateAlterTable()
方法返回false:
public static class SQLServerDialectImproved extends SQLServerDialect {
@Override
public boolean supportsUniqueConstraintInCreateAlterTable() {
return false;
}
}
在持久性单元配置hibernate.dialect
)的persistence.xml
属性中将此类设置为您的方言。
<强> 2。正确的方式:
修复hibernate代码并重新编译:
该错误发生在org.hibernate.mapping.UniqueKey
类,方法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)的唯一约束。