使用JPA命名多列约束

时间:2012-08-15 15:48:14

标签: sql-server-2008 hibernate jpa-2.0 constraints

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 2008JPA 2.0一起使用。

在数据库端,创建了一个索引Hibernate 3.6,而不是UQ__TAG__6EF57B66

我错过了什么?有没有办法从java方面强制执行给定的名称?一个人必须求助于编辑架构文件?我们是一家没有DBA的小商店,我试图在hibernate架构设施的帮助下尽我所能。

1 个答案:

答案 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)的唯一约束。