簡體   English   中英

如何使用 JPA/Hibernate 選擇 DDL 主鍵約束名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM