hibernate如何生成外键约束名称?
如果我没有定义名称,hibernate将生成类似这样的内容
CONSTRAINT fk_2ocepcfwpr1v18dg1ieoe6bau
这个名字是怎么产生的?也许来自MD5字段名称的哈希值或类似的东西?我需要知道所有实例上的名称是否相等。
MD5
Hibernate通过串联表和属性名称来生成约束名称,并将结果转换为MD5。由于某些数据库中的约束名称长度限制,因此需要它。例如,在Oracle数据库中,外键名称的长度不能超过30个符号长度。
Hibernate源org.hibernate.mapping.Constraint中的此代码段
/** * If a constraint is not explicitly named, this is called to generate * a unique hash using the table and column names. * Static so the name can be generated prior to creating the Constraint. * They're cached, keyed by name, in multiple locations. * * @return String The generated name */ public static String generateName(String prefix, Table table, Column... columns) { // Use a concatenation that guarantees uniqueness, even if identical names // exist between all table and column identifiers. StringBuilder sb = new StringBuilder( "table`" + table.getName() + "`" ); // Ensure a consistent ordering of columns, regardless of the order // they were bound. // Clone the list, as sometimes a set of order-dependent Column // bindings are given. Column[] alphabeticalColumns = columns.clone(); Arrays.sort( alphabeticalColumns, ColumnComparator.INSTANCE ); for ( Column column : alphabeticalColumns ) { String columnName = column == null ? "" : column.getName(); sb.append( "column`" ).append( columnName ).append( "`" ); } return prefix + hashedName( sb.toString() ); } /** * Hash a constraint name using MD5. Convert the MD5 digest to base 35 * (full alphanumeric), guaranteeing * that the length of the name will always be smaller than the 30 * character identifier restriction enforced by a few dialects. * * @param s * The name to be hashed. * @return String The hased name. */ public static String hashedName(String s) { try { MessageDigest md = MessageDigest.getInstance( "MD5" ); md.reset(); md.update( s.getBytes() ); byte[] digest = md.digest(); BigInteger bigInt = new BigInteger( 1, digest ); // By converting to base 35 (full alphanumeric), we guarantee // that the length of the name will always be smaller than the 30 // character identifier restriction enforced by a few dialects. return bigInt.toString( 35 ); } catch ( NoSuchAlgorithmException e ) { throw new HibernateException( "Unable to generate a hashed Constraint name!", e ); } }
您可以使用生成自己的约束名称(唯一键和外键)ImplicitNamingStrategy。您可以参考Hibernate5NamingStrategy作为示例。
ImplicitNamingStrategy