如何强制Telosys生成带有columnDefinition的CHAR类型JPA实体注解?
解决Telosys生成JpaRecord时CHAR类型字段缺失columnDefinition的问题
我之前也碰到过一模一样的问题,默认的java7-persistence-commons-jpa-T300模板确实不会自动给CHAR类型字段生成columnDefinition属性,导致hbm2ddl总是生成VARCHAR列。要搞定这个问题,有两种实用的方法,下面给你详细拆解:
方法1:直接修改模板(最推荐)
Telosys的模板基于Velocity引擎,我们可以直接修改JpaRecord的生成逻辑,让它自动识别CHAR类型并补全columnDefinition:
- 找到目标模板:在Telosys的模板目录里,定位到
java7-persistence-commons-jpa-T300下的jpa-record.vm(就是生成实体类的核心模板文件)。 - 定位到
@Column注解的生成代码块,默认大概是这样:@Column( name = "$field.dbName", #if( $field.isNotNull() )nullable = false, #end length = $field.length #if( $field.hasUniqueConstraint() ), unique = true #end ) - 修改这段代码,添加对CHAR类型的判断逻辑:
这里的@Column( name = "$field.dbName", #if( $field.isNotNull() )nullable = false, #end length = $field.length, #if( $field.sqlType == 'CHAR' )columnDefinition = "CHAR($field.length)", #end #if( $field.hasUniqueConstraint() ), unique = true #end )$field.sqlType会读取模型中字段对应的数据库类型,只要你的模型正确识别了CHAR类型,这段代码就会自动生成带对应长度的columnDefinition = "CHAR(xx)"。 - 保存模板后重新运行Telosys生成代码,就能得到符合需求的
@Column注解了。
方法2:通过模型扩展属性自定义
如果不想改动默认模板,也可以在Telosys模型里给CHAR字段手动加扩展属性,让模板读取并生成对应的配置:
- 在你的
.model模型文件中,给CHAR类型字段添加扩展属性,比如:field VVT_NR { type : String dbName : VVT_NR sqlType : CHAR length : 20 notNull : true extendedAttributes : { columnDefinition : "CHAR(20)" } } - 修改模板中
@Column的生成逻辑,加入对扩展属性的判断:@Column( name = "$field.dbName", #if( $field.isNotNull() )nullable = false, #end length = $field.length, #if( $field.getExtendedAttribute('columnDefinition') != null )columnDefinition = "$field.getExtendedAttribute('columnDefinition')", #end #if( $field.hasUniqueConstraint() ), unique = true #end ) - 重新生成代码后,模板就会读取你定义的
columnDefinition并添加到注解里。
额外提醒
- 如果你的模型是通过数据库逆向生成的,要确保Telosys在逆向过程中正确识别了CHAR类型和对应的长度,否则模板拿不到正确的
sqlType和length值,逻辑就失效了。 - 修改模板后记得测试一下其他字段类型(比如VARCHAR、INT)的生成结果,确保不会影响正常字段的注解生成。
内容的提问来源于stack exchange,提问作者Maik Kwi
相关产品推荐
相关产品推荐

