[英]How to choose DDL Primary Key constraint names with JPA/Hibernate
存在一個專有的休眠注釋來指定在 DDL 生成時使用的外鍵約束名稱: org.hibernate.annotations.ForeignKey
。
還有一種方法可以指定主鍵約束名稱嗎?
標准 JPA 不可能,Hibernate 也不支持主鍵約束。
關於這個功能請求( HB-1245 )實際上有一個非常古老的問題,但它看起來並沒有得到太多關注。
您可以使用自定義方言中的一些小模塊來控制生成的 PK 約束名稱。 例如,以下是在 Oracle 中的操作方法(同樣的方法適用於 SQLServer 和 DB2):
public class CustomOracleDialect extends org.hibernate.dialect.Oracle10gDialect {
private CustomTableExporter customTableExporter;
public CustomOracleDialect () {
super();
customTableExporter = new CustomTableExporter(this);
}
@Override
public Exporter<Table> getTableExporter () {
return customTableExporter;
}
static class CustomTableExporter extends StandardTableExporter {
private final static int MAX_TABLE_NAME_LENGTH = 30;
public CustomTableExporter (Dialect dialect) {
super(dialect);
}
@Override
public String[] getSqlCreateStrings (Table table, Metadata metadata) {
final String[] sqlCreateStrings = super.getSqlCreateStrings(table, metadata);
//-- replace " primary key" with " constraint TABLE_NAME_PK primary key "
final String namedPkConstraint = " constraint " + StringUtils.truncate(table.getName(), MAX_TABLE_NAME_LENGTH - 3) + "_PK primary key ";
for (int i = 0; i < sqlCreateStrings.length; ++i) {
sqlCreateStrings[i] = StringUtils.replace(sqlCreateStrings[i], " primary key ", namedPkConstraint);
}
return sqlCreateStrings;
}
}
}
這將改變生成的 DDL:
-- BEFORE:
create table FOO_ENTITY (
FOO_ENTITY_ID number(19, 0) not null,
JOB_NAME varchar2(128 char) not null,
primary key (FOO_ENTITY_ID)
);
對此:
-- AFTER:
create table FOO_ENTITY (
FOO_ENTITY_ID number(19, 0) not null,
JOB_NAME varchar2(128 char) not null,
constraint FOO_ENTITY_PK primary key (FOO_ENTITY_ID)
);
of your primary key (in the database), Hibernate can not do that.如果您正在談論選擇主鍵的(在數據庫中),Hibernate無法做到這一點。
請記住,Hibernate 是一個主要關注映射對象的框架,而不是數據庫實體的創建/維護。
關於定義主鍵,以下鏈接(特別是 2.2.3.2)可能會有所幫助: JBoss Hibernate 指南中的映射標識符屬性
類 org.hibernate.mapping.PrimaryKey 執行以下操作:
public String sqlConstraintString(Dialect dialect) {
StringBuilder buf = new StringBuilder("primary key (");
Iterator iter = getColumnIterator();
while ( iter.hasNext() ) {
buf.append( ( (Column) iter.next() ).getQuotedName(dialect) );
if ( iter.hasNext() ) {
buf.append(", ");
}
}
return buf.append(')').toString();
}
解決方案是覆蓋此方法並返回以“constraint YOUR_CONSTRAINT_NAME 主鍵”開頭的字符串以使其成為可能。 不幸的是,沒有辦法覆蓋這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.