3

我有一个包含许多字段的数据库表,当我使用 Hibernate .hbm 文件为该表生成 POJO 时,这些字段会导致问题。问题是生成的完整构造函数为 Java 生成了太多参数,这会引发编译器错误:

参数过多,参数 xxxx 超出了符合方法参数条件的 255 个字的限制

我想通过抑制 Hibernate 生成完整构造函数来解决这个问题。我的问题是

  1. 如果我没有完整的构造函数,Hibernate 会在运行时中断吗?
  2. 如何告诉我的 hbm 不要生成完整的构造函数?

提前感谢您的任何答案。

4

3 回答 3

7

使用 Hibernate 3.6(可能也适用于早期版本,但我没有测试过),您可以通过创建以下文件自定义 hibernatetool 代码生成以跳过创建构造函数(如果它们有超过 255 个参数):

${hibernate-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"/>

请注意,恕我直言,创建具有> 255个参数的构造函数是休眠工具中的一个错误...

于 2011-09-09T21:01:09.240 回答
2

for 1.: Hibernate 只需要一个空的私有构造函数

于 2011-09-09T18:14:47.850 回答
0

在 Java 中,您不能为方法或构造函数定义超过 255 个参数。这是 Java 中的限制。Hibernate 也遵循相同的策略。

由于 Hibernate 总是使用默认构造函数,因此最好在 PojoConstructors 模板中删除完整的构造函数生成。

${hibernate-cust-src}/pojo/PojoConstructors.ftl

<#--  /** default constructor */ -->
    public ${pojo.getDeclarationName()}() {
    }
于 2015-06-25T07:15:36.223 回答