如何配置hisrc-hyperjaxb移除Double字段@Column的precision与scale
解决Double类型字段@Column注解precision/scale导致的Hibernate报错问题
使用hisrc-hyperjaxb Maven插件结合krasa-jaxb-tools插件从XSD生成带JPA注解的实体类时,XSD中type="xs:double"的元素生成Double字段后,会自动带上包含precision和scale属性的@Column注解:
@Column(name = "SOURCE_RATIO", precision = 20, scale = 10) public Double getSourceRatio() { return sourceRatio; }
当启用spring.jpa.hibernate.ddl-auto=create自动生成数据库Schema时,会触发错误:java.lang.IllegalArgumentException: scale has no meaning for floating point numbers。以下是从根源解决问题的方案:
通过binding.xjc自定义绑定规则移除无效属性
1. 创建binding.xjc绑定文件
在项目src/main/resources目录下创建binding.xjc文件,针对xs:double类型自定义JPA列注解的生成逻辑:
<?xml version="1.0" encoding="UTF-8"?> <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:hj="http://hyperjaxb3.jvnet.org/ejb/schemas/customizations" xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" jaxb:version="2.1" jaxb:extensionBindingPrefixes="hj orm"> <!-- 批量匹配XSD中所有xs:double类型的元素和属性 --> <jaxb:bindings schemaLocation="你的XSD文件路径(如src/main/resources/your-schema.xsd)" node="/xs:schema"> <!-- 处理double类型的元素 --> <jaxb:bindings node="//xs:element[@type='xs:double']"> <hj:basic> <orm:column name="{@name}" /> <!-- 保留原字段名,无需手动修改 --> </hj:basic> </jaxb:bindings> <!-- 处理double类型的属性 --> <jaxb:bindings node="//xs:attribute[@type='xs:double']"> <hj:basic> <orm:column name="{@name}" /> </hj:basic> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
- 替换
schemaLocation为你的实际XSD文件路径; - 使用
{@name}可以自动继承XSD中定义的元素/属性名,无需逐个指定字段名。
2. 配置Maven插件引入绑定文件
在pom.xml的hisrc-hyperjaxb插件配置中,添加绑定文件的引用:
<plugin> <groupId>org.patrodyne.jvnet</groupId> <artifactId>hisrc-hyperjaxb3-ejb-plugin</artifactId> <version>你的插件版本号</version> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <bindingDirectory>src/main/resources</bindingDirectory> <bindingFiles> <bindingFile>binding.xjc</bindingFile> </bindingFiles> <!-- 保留原有其他配置 --> </configuration> </plugin>
3. 重新生成实体类
执行Maven命令重新生成代码:
mvn clean generate-sources
生成后的Double类型字段的@Column注解将不再包含precision和scale属性:
@Column(name = "SOURCE_RATIO") public Double getSourceRatio() { return sourceRatio; }
临时规避方案(不推荐)
如果暂时无法调整绑定规则,可通过Hibernate配置忽略无效属性,在application.properties中添加:
spring.jpa.properties.hibernate.type.preferred_float_type=double
但此方案仅为临时 workaround,建议优先通过绑定文件从根源解决注解生成问题。
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

