UnsupportedOperationException: приложение должно предоставлять соединения JDBC.

Если я ничего не устанавливаю программно, а просто вызываю Configuration configuration = new Configuration().configure(); и использую hibernate.properties (как показано ниже), все работает просто отлично. Как только я пытаюсь указать имя пользователя, пароль и URL-адрес подключения программно, я получаю странные исключения, намекающие на файл hbm. Что мне не хватает?

Это работает

hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://myEC2/mCruiseOnServerDB?autoReconnect=true&failOverReadOnly=false&maxReconnects=10
hsqldb.write_delay_millis=0
shutdown=true
hibernate.connection.username=root
hibernate.connection.password=mypwd
hibernate.connection.pool_size=2
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
hibernate.c3p0.idle_test_period=300
hibernate.c3p0.timeout=120

Согласно рекомендации @Kshitij. Делаем смешанный режим.

Hibernate.properties теперь

hibernate.connection.driver_class=com.mysql.jdbc.Driver
hsqldb.write_delay_millis=0
shutdown=true
hibernate.connection.pool_size=2
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect

Кодекс

String connection = "jdbc:mysql://"
            + Globals.DBSERVER
            + "/mCruiseOnServerDB?autoReconnect=true&failOverReadOnly=false&maxReconnects=10";
        Configuration configuration = new Configuration()   
            .setProperty("hibernate.connection.url", connection)                                
            .setProperty("hibernate.connection.username", Globals.DB_USER_NAME)     
            .setProperty("hibernate.connection.password", Globals.DB_PASSWORD);
        configuration.configure();

        sessionFactory = configuration
                .buildSessionFactory(new ServiceRegistryBuilder()
            .buildServiceRegistry());

Исключение

Теперь я получаю это исключение, по одному для каждой записи mapping resource в моем файле hbm.

11 May 2013 08:46:31,969 1300 [main] FATAL ReadOnlyOperations  - Have chosen to ignore this runtime exception java.lang.UnsupportedOperationException: The application must supply JDBC connections, may be fatal, examine this carefully
11 May 2013 08:46:31,969 1300 [main] FATAL ReadOnlyOperations  - java.lang.UnsupportedOperationException: The application must supply JDBC connections

Резюме

Если я использую все hibernate.properties и без кода (без .setProperty в коде), все работает отлично. Если я использую часть hibernate.properties и код части (сервер, имя пользователя, пароль), я получаю ошибки в hbm для каждого свойства сопоставления.

Мне нужен кто-то, кто поможет мне понять, чего мне не хватает. Это должно быть что-то действительно основное.


person Siddharth    schedule 10.05.2013    source источник
comment
Ссылка   -  person gks    schedule 10.05.2013
comment
Я уже пробовал, не работает.   -  person Siddharth    schedule 10.05.2013


Ответы (3)


Вау, только что исправил проблему.

sessionFactory = configuration.buildSessionFactory(new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry());

мне не хватало

.applySettings(configuration.getProperties())

Обучение

  1. configure() следует вызывать ПОСЛЕ setProperty
  2. Используйте hibernate.connection.url и НЕ connection.url, если вы используете hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
  3. Установите свойство log4j для журналов гибернации на ВСЕ, чтобы вы могли видеть более подробные проблемы.
  4. Чтобы избавиться от WARN Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!, вам нужно заменить http://www.hibernate.org/dtd/ в файле cfg.xml и во всех файлах hbm. Не забывайте про файлы hbm, они тоже используют один и тот же DTD.

Наконец, упомянуто об этом, чтобы исправить это. Последний совет от Bill Gorder великолепен.

private static SessionFactory configureSessionFactory()    
        throws HibernateException {    
    Configuration configuration = new Configuration();    
    configuration.configure();    
    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()    
            .applySettings(configuration.getProperties())    
            .buildServiceRegistry();    
    return configuration.buildSessionFactory(serviceRegistry);    
}  
person Siddharth    schedule 13.05.2013
comment
так вы смешиваете свойства или добавляете все внутрь java-файла? - person Kshitij; 13.05.2013
comment
микширование, некоторые в файле свойств, а некоторые в java - person Siddharth; 13.05.2013
comment
У меня тоже была такая же проблема. Я не могу найти класс ServiceRegistryBuilder() Какая версия Hibernate будет работать. Я использую Hibernate 3.x - person Rookie007; 30.06.2014

Альтернативным способом будет загрузка всех свойств из hibernate.cfg.xml или hibernate.properties и перезапись только тех, которые требуются программно.

Configuration config = new Configuration().configure();
config.setProperty("hibernate.connection.username", "xyz" );
config.setProperty("hibernate.connection.password", "password" ); 
person Kshitij    schedule 10.05.2013
comment
Теперь я получаю 10 May 2013 14:20:34,238 1196 [main] FATAL ReadOnlyOperations - Have chosen to ignore this runtime exception java.lang.UnsupportedOperationException: The application must supply JDBC connections, may be fatal, examine this carefully 1 для каждого файла hbm. - person Siddharth; 10.05.2013
comment
В основном ни один из файлов hbm не загружается после того, как я внес ваши изменения. Так что она еще не завершена. - person Siddharth; 10.05.2013
comment
вы установили hibernate.connection.url? из вашего модифицированного кода не похоже, что вы поставили это программно. - person Kshitij; 12.05.2013
comment
Да, было, просто забыл упомянуть. - person Siddharth; 12.05.2013
comment
также я вижу, что вы сделали configuration.configure(); после установки свойств. Вам нужно сделать это до setProperty. Посмотрите, как я это сделал в примере, который я показал выше. - person Kshitij; 13.05.2013
comment
Я пробовал, не работает. Я попробую еще раз и сообщу точную ошибку. - person Siddharth; 13.05.2013
comment
Точно такое же исключение, вообще никаких изменений. - person Siddharth; 13.05.2013
comment
Извините, ваши предложения не сработали. .configure также следует вызывать после setProperty. - person Siddharth; 13.05.2013
comment
@Siddharth, судя по вашему ответу, вы последовали моему предложению об использовании свойств из файлов конфигурации, а также программно. Кроме того, .applySettings(..) помог вам. хорошо, что сработало. - person Kshitij; 13.05.2013
comment
Да вы правы. Ваш ответ дал мне пищу для размышлений. Просто исправьте конфигурацию после setProperties, и я с радостью проголосую. Без .applySettings просто не работает. Также удалите свой комментарий до, а не после. Давайте очистим этот пост SO. - person Siddharth; 13.05.2013

Даже если вы устанавливаете параметры подключения (URL, имя пользователя, пароли) программно, вы должны убедиться, что другие условия, которые привели бы к использованию соединений JDBC при запуске приложения, отсутствуют. Я выделил как минимум два:

  1. Установка для свойства hibernate.hbm2ddl.auto любого другого значения, кроме "none", принудительно устанавливает соединение с БД при запуске; для проверки, создания или обновления схемы БД...

  2. Если вы используете свойства C3P0 в файле hibernate.cfg.xml или persistence.xml, это также заставляет менеджера пула пытаться получить соединения из БД при запуске.

Во всех этих случаях, поскольку вы принудительно подключились к БД, не настроив также параметры подключения, вы получите различные ошибки (например, те, с которыми вы столкнулись)...

Чтобы исправить эту ошибку, либо отключите свойство (hibernate.hbm2ddl), либо установите другие свойства также программно (hibernate.c3p0.*).

person arpadf    schedule 04.04.2014