1

name属性@UniqueConstraint似乎没有效果。

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

}

我正在使用SQL Server 2008JPA 2.0Hibernate 3.6

在 DB 端UQ__TAG__6EF57B66创建一个索引,而不是UQ_TAG_USER.

我错过了什么?有没有办法从java端强制执行给定的名称?并且必须求助于编辑模式文件?我们是一家没有 DBA 的小商店,我尝试在休眠模式工具的帮助下尽我所能。

4

1 回答 1

3

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

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.UniqueKeyclass,方法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) 的唯一约束。

于 2012-08-23T19:25:39.487 回答