UnsupportedOperationException:应用程序必须提供JDBC连接

时间:2013-05-10 11:04:11

标签: hibernate hibernate-mapping

如果我没有以编程方式设置任何内容,只需调用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());

例外

我现在得到这个异常,一个用于我的hbm文件中的每个mapping resource条目。

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中为每个映射属性获取错误。

我需要有人帮我弄清楚我错过了什么。它应该是非常基本的东西。

3 个答案:

答案 0 :(得分:3)

哇,刚刚修好了问题。

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

我错过了

  
    

.applySettings(configuration.getProperties())

  

学习收获

  1. configure()应该被称为 AFTER setProperty
  2. 如果您使用hibernate.connection.url
  3. ,请使用connection.url hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
  4. 将hibernate日志的log4j属性设置为ALL,以便您可以看到更详细的问题
  5. 要摆脱WARN Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!,您需要替换 cfg.xml 中的http://www.hibernate.org/dtd/和所有 hbm 文件。不要忘记 hbm 文件,它们也使用相同的DTD。
  6. 最后,提到这个,修复thisBill 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);    
    }  
    

答案 1 :(得分:0)

另一种方法是从hibernate.cfg.xmlhibernate.properties加载所有属性,并仅以编程方式覆盖所需的属性。

Configuration config = new Configuration().configure();
config.setProperty("hibernate.connection.username", "xyz" );
config.setProperty("hibernate.connection.password", "password" ); 

答案 2 :(得分:0)

即使您以编程方式设置连接参数(URL,用户名,密码),也应确保在应用程序启动时强制使用JDBC连接的其他条件不存在。我发现至少有两个:

  1. hibernate.hbm2ddl.auto 属性设置为除“none”之外的任何其他值会强制在启动时连接到数据库;验证,创建或更新数据库架构......

  2. 如果您在hibernate.cfg.xml或persistence.xml中使用C3P0属性,这也会强制池管理器在启动时尝试从数据库获取连接

  3. 在所有这些情况下,由于您强制连接到数据库而没有配置连接参数,您将收到各种错误(如您所面对的那样)......

    为了解决这些错误,请禁用属性( hibernate.hbm2ddl )或以编程方式设置其他属性( hibernate.c3p0。*