2014-07-17 6 views
1

У меня есть файл HBM, заполненный для таблицы, которую мы имеем. Я думаю, создал Java-объект, который будет использовать Hibernate. В Entity у меня есть пустой конструктор, а затем полный конструктор, который имеет все поля. Я помещаю их в том же порядке, что и в файле HBM.Hibernate: Почему не вызывается полный конструктор?

Каждый раз, когда Hibernate использует Entity, он всегда вызывает пустой конструктор вместо полного конструктора.

Есть ли уловка или что-нибудь, что сделало бы Hibernate использовать полный конструктор? Это также происходит и для всех детей Сущности. Я сталкиваюсь с проблемой, в которой мой запрос.list() работает медленно и хочет, чтобы это работало, чтобы проверить, не ускорит ли это.

Спасибо!

Примечание: я не включил содержимое НВМ и Java-файл, потому что (а) она содержит информацию о компании и (б) это довольно большое. Это займет очень много времени, чтобы раздеться. Я извиняюсь, если это неудобно :(

+1

Если вниз голосования, скажите, пожалуйста, почему так я могу настроить вопрос. – Ascalonian

+0

Насколько я знаю, Hibernate не будет называть «полный» конструктор. Он вызовет ваш конструктор no-arg и вызовет вызов поля или свойства (getter/setter) в зависимости от того, как вы его настроили. Вы проверили документацию по Hibernate? [2.2. Сущность Java-класса] (https://docs.jboss.org/hibernate/core/4.3/quickstart/en-US/html_single/#hibernate-gsg-tutorial-basic-entity) –

+0

Я проигнорировал (чего я никогда не делал раньше, btw), потому что если вы выполните поиск по этой теме, вы найдете множество обращений, которые объясняют, как hibernate вызывает конструкторы. Я сниму нижний план (если система позволит мне), но, похоже, вы не проводили поиск, прежде чем публиковать свой вопрос. Если я ошибаюсь, я прошу прощения. Но в любом случае, hibernate вызовет конструктор default/no-args. –

ответ

1

Вы работаете с очень большим ResultSets? Что хранилище вы используете? Я столкнулся с подобными проблемами и это сводилось к настройкам базы данных для спящего режима.

Вот несколько других вопросов, чтобы проверить:

Simple hibernate query returning very slowly

Hibernate queries slow down drastically after an entity is loaded in the session

для спящего режима, я нашел следующие настройки вы можете настройки производительности для повышения производительности:.

 // update - Create if schema doesn't exists; update if column doesn't 
    // exist 
    // create - Empties the database before creating it 
    // create-drop - Drops the database when the SessionFactory is closed 
    config.setProperty("hibernate.hbm2ddl.auto", hbm2ddlMode); 
    config.setProperty("hibernate.cache.use_query_cache", "true"); 
    config.setProperty("hibernate.cache.use_second_level_cache", "true"); 
    config.setProperty("hibernate.cache.region.factory_class", 
     "org.hibernate.cache.ehcache.EhCacheRegionFactory"); 
    config.setProperty("hibernate.cache.provider_class", 
     "org.hibernate.cache.EhCacheProvider"); 
    // config.setProperty("hibernate.cache.provider_class", 
    // "org.hibernate.cache.NoCacheProvider"); 
    config.setProperty("hibernate.jdbc.fetch_size", "1000"); 
    config.setProperty("hibernate.jdbc.batch_size", "50"); //batches network calls in one 
    config.setProperty("hibernate.jdbc.use_scrollable_resultset", "true"); 

    config.setProperty("hibernate.connection.provider_class", 
     "org.hibernate.connection.C3P0ConnectionProvider"); 
    config.setProperty("hibernate.c3p0.acquire_increment", "1"); 
    config.setProperty("hibernate.c3p0.idle_test_period", "10"); 
    config.setProperty("hibernate.c3p0.min_size", "1"); 
    config.setProperty("hibernate.c3p0.max_size", "8"); 
    config.setProperty("hibernate.c3p0.timeout", "10"); 
    config.setProperty("javax.persistence.validation.mode", "none"); 
    config 
     .setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false"); 
    config.setProperty("hibernate.show_sql", "false"); 

Обратите внимание, эти специфические параметры не могут быть идеально подходит для вашей базы данных, но вы должны быть в состоянии повысить производительность за счет тонкой настройки свойств выше. Подробное объяснение можно найти на doc site.

Для SQLite, вы должны настроить несколько дополнительных параметров:

 config.setPageSize(4096); 
    config.setCacheSize(-256); 

    config.setSharedCache(true); 
    config.setReadUncommited(true); 

    //Be careful with these settings if needed for concurrency 
    //*************************************************** 
    config.setLockingMode(LockingMode.NORMAL); 
    config.setSynchronous(SynchronousMode.NORMAL); 
    config.setJournalMode(JournalMode.WAL); 
    config.setTempStore(TempStore.MEMORY); 
    //*************************************************** 

Postgres немного проще и более изолированным в настройках самой базы данных. Однако имейте в виду, что оптимизатор запросов запускается после первого запуска запроса.

2

Существует 3 стратегии создания объектов через Hibernate (что я знаю).

Стандартный метод

HQL или критерии запросов, как select from cat будет создавать POJO, (здесь, экземпляры Cat - или подклассы), и Hibernate будет делать это, вызвав конструктор без аргументов. Из документации:

Все постоянные классы должны иметь конструктор по умолчанию (который может быть непубличный), так что Hibernate может инстанцирует их с помощью java.lang.reflect.Constructor.newInstance(). Рекомендуется, чтобы этот конструктор был определен с хотя бы видимостью пакета, чтобы генерация прокси-сервера во время выполнения работала должным образом.

Выбор конструктора с HQL

Можно ссылаться на конкретный конструктор для вызова через специально созданный оператор выбора в запросе HQL.
E.g. select new com.example.Cat(cat.id, cat.name) from Cat работает. Если ваш запрос правильно определен, вы также можете использовать в своем выборе такие функции, как count(). Это вызвало бы 2 аргумента contructor на Cat - хотя я не думаю это автоматически отрегулирует, чтобы найти другой класс, который Cat в случае полиморфизма.

Вы можете исследовать различные возможности (например, как построить список) в документации: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-select

Использование результата трансформатор

Концепция ResultTransformer позволяет определить, на Criteria Objet, как результаты будут преобразованы в объекты. Используя AliasToBeanConstructorResultTransformer, который принимает аргумент java.lang.Constructor, вы можете выбрать вызывающий конструктор. (По умолчанию каждый критерий имеет ResultTransformer, который равен RootEntityResultTransformer).

0

После некоторых исследований я нашел этот полезный

зимуют субъект должен определить конструктор без аргументов. Hibernate создает новые экземпляры объектов через отражение, с методом Class.newInstance(). Этот метод требует, чтобы конструктор аргументов не имел успеха. Если сущность не предоставляет конструктор без аргументов, будет выведено InstantiationException Hibernate.

Проверить here

Смежные вопросы