Sql server 2008 使用JPA命名多列约束

Sql server 2008 使用JPA命名多列约束,sql-server-2008,hibernate,jpa-2.0,constraints,Sql Server 2008,Hibernate,Jpa 2.0,Constraints,@UniqueConstraint的name属性似乎没有效果 @Entity @Table(name = "TAG", uniqueConstraints = @UniqueConstraint(columnNames = { "TAG_NAME", "USERS_ID" }, name="UQ_TAG_USER")) public class Tag extends BaseEntity { } 我正在使用sqlserver2008,jpa2.0和hibernate3.6

@UniqueConstraint
name
属性似乎没有效果

@Entity
@Table(name = "TAG", uniqueConstraints = @UniqueConstraint(columnNames = {
        "TAG_NAME", "USERS_ID" }, name="UQ_TAG_USER"))
public class Tag extends BaseEntity {

}
我正在使用
sqlserver2008
jpa2.0
hibernate3.6

在数据库端,将创建一个索引,
UQ\uu标记\uuu 6EF57B66
,而不是
UQ\u标记\u用户


我错过了什么?没有办法从java端强制使用给定的名称吗?人们必须求助于编辑模式文件吗?我们是一个没有DBA的小商店,我试图借助hibernate模式工具尽可能多地工作。

我假设您正在使用hibernate,因为您在这个问题的标签中有它。这是hibernate中的一个错误/缺失功能:

当方言支持在与create table相同的语句中创建约束时,它将忽略唯一的约束名称。 我已经检查了SqlServer和Oracle方言,它们都支持这种创建约束的方式,这将导致您遇到的错误

有两种方法可以解决此错误:

1。快捷方式:
只需扩展方言并为
supportsUniqueConstraintInCreateAlterTable()方法返回false即可:

public static class SQLServerDialectImproved extends SQLServerDialect {
    @Override
    public boolean supportsUniqueConstraintInCreateAlterTable() {
        return false;
    }
}
并在持久性单元配置(
persistence.xml
)的
hibernate.dialogue
属性中将该类设置为您的方言

2。正确的方法:
修复休眠代码并重新编译:
该bug位于
org.hibernate.mapping.UniqueKey
类,方法
sqlConstraintString()
将返回所有方言的
unique(TAG\u NAME,USERS\u ID)
,即使它们支持
constraint-UQ\u-TAG\u-USER-unique(TAG\u NAME,USERS\u ID)
但这可能是一个更大的变化(需要支持各种方言等)

发动机罩下:
如果使用原始方言,将导致执行以下sql语句来创建表(添加的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)的唯一约束。

不幸的是,上述快速解决方案似乎不起作用,至少使用Hibernate 4.1.7和PostgreSQL82方言。CREATETABLE语句的“unique”子句确实被抑制,但没有生成“CREATEUNIQUE index”语句。
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)