生成的完整构造函数包含太多参数

发布于 2024-12-03 13:42:54 字数 331 浏览 0 评论 0原文

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

参数太多,参数 xxxx 超出了方法参数的 255 个字的限制

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

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

预先感谢您的任何答复。

I have a DB table with many, many fields that is causing an issue when I generate a POJO for that table using a Hibernate .hbm file. The issue is the full constructor being generated produces too many params for Java, which throws compiler error:

Too many parameters, parameter xxxx is exceeding the limit of 255 words eligible for method parameters

I'd like to get around this by suppressing the generation of the full constructor by Hibernate. My question is

  1. Would Hibernate break at runtime if I don't have the full constructor?
  2. How can I tell my hbm not to produce the full constructor?

Thanks in advance for any answers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

绝不放开 2024-12-10 13:42:54

我尚未对此进行测试),您可以通过创建以下文件来自定义 hibernatetool 代码生成,以跳过创建构造函数(如果构造函数的参数超过 255 个):

使用 Hibernate 3.6(也可能适用于早期版本,但 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"/>

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

With Hibernate 3.6 (may work with earlier versions as well, but I've not tested that), you can customise the hibernatetool code generation to skip creating constructors if they'd have more than 255 parameters, by creating the following file:

${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>  

this overwrites the PojoConstructors.ftl in the hibernate-tools.jar.

If you're using Ant to build, you'll need to ensure that the ${hibernate-cust-src} is in the classpath for the hibernate-tools task.

<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"/>

Note, IMHO it's a bug in hibernate tools to create a constructor with >255 params...

仅冇旳回忆 2024-12-10 13:42:54

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

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

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

<#--  /** default constructor */ -->
    public ${pojo.getDeclarationName()}() {
    }

In Java you can't define more than 255 pararmeters for a method or constructor. This is the restriction in Java.And Hibernate also following same strategy.

As Hibernate always use default constructor,then it better to remove full constructor generation in the PojoConstructors template.

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

<#--  /** default constructor */ -->
    public ${pojo.getDeclarationName()}() {
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文