3

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

パラメーターが多すぎます。パラメーター xxxx は、メソッド パラメーターとして適格な 255 語の制限を超えています。

Hibernate による完全なコンストラクターの生成を抑制することで、これを回避したいと考えています。私の質問は

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

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

4

3 に答える 3

7

Hibernate 3.6では(以前のバージョンでも機能する可能性がありますが、テストはしていません)、次のファイルを作成することで、255を超えるパラメーターがある場合にコンストラクターの作成をスキップするようにhibernatetoolコード生成をカスタマイズできます。

$ {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を超えるパラメーターを持つコンストラクターを作成することはHibernateツールのバグです...

于 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 に答える