Созданный полный конструктор содержит слишком много параметров - PullRequest
3 голосов
/ 09 сентября 2011

У меня есть таблица БД со множеством полей, которая вызывает проблему при создании POJO для этой таблицы с использованием файла Hibernate .hbm.Проблема заключается в том, что генерируемый полный конструктор создает слишком много параметров для Java, что приводит к ошибке компилятора:

Слишком много параметров, параметр xxxx превышает ограничение в 255 слов, подходящих для параметров метода

Я бы хотел обойти это, подавив создание полного конструктора в Hibernate.Мой вопрос:

  1. Сбой Hibernate во время выполнения, если у меня нет полного конструктора?
  2. Как я могу сказать моему hbm не производить полный конструктор?

Заранее спасибо за любые ответы.

Ответы [ 3 ]

6 голосов
/ 10 сентября 2011

С 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 параметрами ...

2 голосов
/ 09 сентября 2011
0 голосов
/ 25 июня 2015

В Java вы не можете определить более 255 параметров для метода или конструктора. Это ограничение в Java. И Hibernate также придерживается той же стратегии.

Поскольку Hibernate всегда использует конструктор по умолчанию, то лучше удалить полную генерацию конструктора в шаблоне PojoConstructors.

$ {зимуют-Каст-Src} /pojo/PojoConstructors.ftl

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