この質問のタグにHibernateが含まれているため、Hibernateを使用していると思います。これはHibernateのバグ/欠落機能です:
https://hibernate.onjira.com/browse/HB-1245
方言がcreatetableと同じステートメントでの制約の作成をサポートしている場合は、一意の制約名を単に無視します。SqlServerとOracleの方言を確認しましたが、どちらもこの制約の作成方法をサポートしているため、発生しているバグが発生します。
このバグを回避するには、次の2つの方法があります。
1.簡単な方法:
方言を拡張し、メソッドに対してfalseを返すだけですsupportsUniqueConstraintInCreateAlterTable()
。
public static class SQLServerDialectImproved extends SQLServerDialect {
@Override
public boolean supportsUniqueConstraintInCreateAlterTable() {
return false;
}
}
そして、このクラスをhibernate.dialect
永続性ユニット構成のプロパティの方言として設定します(persistence.xml
)。
2.正しい方法:
休止状態のコードを修正して再コンパイルします
。バグは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)を使用した一意の制約の作成が含まれます。