2011-09-09 53 views
3

我有一個數據庫表有很多很多領域,當我使用Hibernate .hbm文件爲該表生成一個POJO時,會造成問題。問題是生成完整的構造產生的Java太多的參數,可以會拋出編譯器錯誤:生成的完整構造函數包含太多的參數

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

我想通過Hibernate的抑制完全構造函數的生成來解決這個問題。我的問題是

  1. 如果我沒有完整的構造函數,Hibernate會在運行時中斷嗎?
  2. 我該如何告訴我的HBM不能生成完整的構造函數?

在此先感謝您的任何答案。

+0

我最終什麼事做 - 我拿了一串,可以進行邏輯分組在一起作爲一個獨立的實體領域,並標記它們作爲我的HBM中的一個組件。它仍然感覺有點冒險,但它是一種簡單的方法,以減少參數的Java類方法的數量,所以我在255. – WhyGeeEx

回答

6

使用Hibernate 3.6(可與早期版本的工作爲好,但我沒有測試過),你可以自定義hibernatetool代碼生成跳過創建構造函數,如果他們想擁有超過255個參數,通過創建以下文件:

$ {休眠 - 卡斯特-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> 

這將覆蓋PojoConstructors.ftl在hibernate-tools.jar中。

如果您使用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個PARAMS構造...

+0

同意這個錯誤,並感謝您的答覆。 – WhyGeeEx

0

在Java中,你不能定義超過255個pararmeters的方法或構造函數。這是Java中的限制.Hibernate也遵循同樣的策略。

由於Hibernate總是使用默認構造函數,所以最好在PojoConstructors模板中移除完整的構造函數生成。

$ {休眠 - 卡斯特-SRC} /pojo/PojoConstructors.ftl

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