我有一个包含许多字段的数据库表,当我使用Hibernate .hbm文件为该表生成POJO时会导致问题。问题是生成的完整构造函数会为Java生成太多的参数,这会引发编译器错误:
参数太多,参数xxxx超出了符合方法参数的255个字的限制
我想通过抑制Hibernate生成完整构造函数来解决这个问题。我的问题是
提前感谢您的任何答案。
答案 0 :(得分:6)
使用Hibernate 3.6(也可以使用早期版本,但我没有对其进行测试),您可以通过创建以下文件来自定义hibernatetool代码生成以跳过创建构造函数(如果它们具有超过255个参数) :
$ {冬眠-CUST-SRC} /pojo/PojoConstructors.ftl
<#-- /** default constructor */ -->
public ${pojo.getDeclarationName()}() {
}
<#if pojo.needsMinimalConstructor() && pojo.getPropertiesForMinimalConstructor().size() lte 255> <#-- /** minimal constructor */ -->
public ${pojo.getDeclarationName()}(${c2j.asParameterList(pojo.getPropertyClosureForMinimalConstructor(), jdk5, pojo)}) {
<#if pojo.isSubclass() && !pojo.getPropertyClosureForSuperclassMinimalConstructor().isEmpty() >
super(${c2j.asArgumentList(pojo.getPropertyClosureForSuperclassMinimalConstructor())});
</#if>
<#foreach field in pojo.getPropertiesForMinimalConstructor()>
this.${field.name} = ${field.name};
</#foreach>
}
</#if>
<#if pojo.needsFullConstructor() && pojo.getPropertiesForFullConstructor().size() lte 255>
<#-- /** full constructor */ -->
public ${pojo.getDeclarationName()}(${c2j.asParameterList(pojo.getPropertyClosureForFullConstructor(), jdk5, pojo)}) {
<#if pojo.isSubclass() && !pojo.getPropertyClosureForSuperclassFullConstructor().isEmpty()>
super(${c2j.asArgumentList(pojo.getPropertyClosureForSuperclassFullConstructor())});
</#if>
<#foreach field in pojo.getPropertiesForFullConstructor()>
this.${field.name} = ${field.name};
</#foreach>
}
</#if>
这会覆盖hibernate-tools.jar中的PojoConstructors.ftl。
如果您正在使用Ant进行构建,则需要确保${hibernate-cust-src}
位于hibernate-tools任务的类路径中。
<path id="toolslib">
<pathelement location="${hibernate-cust-src}"/>
... [other locations for hibernate-tools and dependencies]
</path>
<taskdef name="hibernatetool"
classname="org.hibernate.tool.ant.HibernateToolTask"
classpathref="toolslib"/>
注意,恕我直言,这是hibernate工具中的一个错误,用于创建一个> 255 params的构造函数...
答案 1 :(得分:2)
答案 2 :(得分:0)
在Java中,您无法为方法或构造函数定义超过255个参数。这是Java中的限制.Hibernate也遵循相同的策略。
由于Hibernate总是使用默认构造函数,因此最好在PojoConstructors模板中删除完整的构造函数生成。
$ {冬眠-CUST-SRC} /pojo/PojoConstructors.ftl
<#-- /** default constructor */ -->
public ${pojo.getDeclarationName()}() {
}