如果我没有以编程方式设置任何内容,只需调用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
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中为每个映射属性获取错误。
我需要有人帮我弄清楚我错过了什么。它应该是非常基本的东西。
答案 0 :(得分:3)
sessionFactory = configuration.buildSessionFactory(new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry());
我错过了
.applySettings(configuration.getProperties())
学习收获
hibernate.connection.url
connection.url
和不 hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
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。最后,提到这个,修复this。 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);
}
答案 1 :(得分:0)
另一种方法是从hibernate.cfg.xml
或hibernate.properties
加载所有属性,并仅以编程方式覆盖所需的属性。
Configuration config = new Configuration().configure();
config.setProperty("hibernate.connection.username", "xyz" );
config.setProperty("hibernate.connection.password", "password" );
答案 2 :(得分:0)
即使您以编程方式设置连接参数(URL,用户名,密码),也应确保在应用程序启动时强制使用JDBC连接的其他条件不存在。我发现至少有两个:
将 hibernate.hbm2ddl.auto 属性设置为除“none”之外的任何其他值会强制在启动时连接到数据库;验证,创建或更新数据库架构......
如果您在hibernate.cfg.xml或persistence.xml中使用C3P0属性,这也会强制池管理器在启动时尝试从数据库获取连接
在所有这些情况下,由于您强制连接到数据库而没有配置连接参数,您将收到各种错误(如您所面对的那样)......
为了解决这些错误,请禁用属性( hibernate.hbm2ddl )或以编程方式设置其他属性( hibernate.c3p0。* )