2011-09-09 2 views
3

Hibernate .hbmファイルを使用してそのテーブルのPOJOを生成すると問題を引き起こす多くのフィールドを持つDBテーブルがあります。生成された完全なコンストラクタには多すぎるパラメータが含まれています

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

私はHibernateが、フルコンストラクタの生成を抑制することにより、これを回避したいと思います:問題が発生して、完全なコンストラクタは、コンパイラのエラーをスローするJava、あまりにも多くのparamsを生成しています。私の質問は

  1. 完全なコンストラクタを持っていないと、実行時にHibernateが中断しますか?
  2. hbmに完全なコンストラクタを生成しないように指示するにはどうすればよいですか?

ご回答ありがとうございます。

+0

{-カスト-SRC休止} - 私は論理的に独立したエンティティとしてグループ化することができフィールドの束を取って、それらをラベル付け私のhbm内のコンポーネントとして。それはまだ少しハッキリしているように感じますが、それはちょうど私が255未満になるようにJavaクラスメソッドにパラメータの数を減らすための簡単な方法です。 – WhyGeeEx

答えて

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> 

これは休止状態 - 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を超えるpararmetersを定義することはできませんJavaでは

+0

バグについて同意し、 。 – WhyGeeEx

0

...> 255件のparamsとコンストラクタを作成するために、Hibernateツールのバグです。これはJavaの制限です。そしてHibernateも同じ戦略に従います。

Hibernateは常にデフォルトのコンストラクタを使用するため、PojoConstructorsテンプレートの完全なコンストラクタ生成を削除する方がよいでしょう。

$ /pojo/PojoConstructors.ftl私がやってしまった何を

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