开门见山
hibernate4.3.1
都是要修改源码的,我找了好久才找到,hibernate自己内部实现了注释是垮数据库的,只是没有注释的注解
org.hibernate.cfg.Ejb3Column 类copy出来粘贴到项目中修改
bind方法
public void bind() {
if ( StringHelper.isNotEmpty( formulaString ) ) {
LOG.debugf( "Binding formula %s", formulaString );
formula = new Formula();
formula.setFormula( formulaString );
}
else {
initMappingColumn(
logicalColumnName, propertyName, length, precision, scale, nullable, sqlType, unique, true
);
if ( defaultValue != null ) {
mappingColumn.setDefaultValue( defaultValue );
}
mappingColumn.setComment(comment);
if ( LOG.isDebugEnabled() ) {
LOG.debugf( "Binding column: %s", toString() );
}
}
}
添加了
mappingColumn.setComment(comment);
private static void applyColumnDefault(Ejb3Column column, PropertyData inferredData) {
final XProperty xProperty = inferredData.getProperty();
if ( xProperty != null ) {
ColumnDefault columnDefaultAnn = xProperty.getAnnotation( ColumnDefault.class );
if ( columnDefaultAnn != null ) {
column.setDefaultValue( columnDefaultAnn.value() );
}
ApiModelProperty apip = xProperty.getAnnotation( ApiModelProperty.class );
column.setComment((apip!=null && apip.value()!=null)?apip.value().replaceAll("'", "\""):"");
}
else {
LOG.trace(
"Could not perform @ColumnDefault lookup as 'PropertyData' did not give access to XProperty"
);
}
}
添加了
ApiModelProperty apip = xProperty.getAnnotation( ApiModelProperty.class );
column.setComment((apip!=null && apip.value()!=null)?apip.value().replaceAll("'", "\""):"");
ApiModelProperty是我的注解,你可以写成你的注解 ,我这是接口文档可以给前端人看,然后数据库也用这里面的描述就省了很多事
外键生成修改,唯一约束名称修改
org.hibernate.mapping.Constraint
public static String hashedName(String s) {
return s.replaceAll("`", "_");
// 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 );
// }
}
这样生成的外键名称就是 这样的
FK_table_bbs_article_column_bbstype_
表字段数序跟类中定义的顺序一样
org.hibernate.cfg.PropertyContainer
private final <span style="background-color: rgb(255, 102, 102);">LinkedHashMap</span><String, XProperty> fieldAccessMap;
/**
* Constains the properties which must be returned in case the class is accessed via {@code AccessType.Property}. Note,
* this does not mean that all {@code XProperty}s in this map are properties/methods. Due to JPA access rules single properties
* can have different access type than the overall class access type.
*/
private final <span style="background-color: rgb(255, 102, 102);">LinkedHashMap</span><String, XProperty> propertyAccessMap;
默认是TreeMap改成LinkedHashMap就可以了
hibernate开发的大神都不看数据库的,所以他们就没考虑这些东西,他们认为用了hibernate就不需要看sql了