hibernate字段注释和生成表的字段顺序和外键名称

开门见山

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了

猜你喜欢

转载自blog.csdn.net/hewei314599782/article/details/50338557
今日推荐