无法使用 Spring 4 和 Hibernate 4 创建到 Oracle 11g 的连接
Cannot create connection to Oracle 11g with Spring 4 and Hibernate 4
我的应用程序使用 Spring 4、Hibernate 4、Java 1.7。这是一个桌面应用程序而不是 Web 应用程序,因此不涉及服务器。我正在尝试创建到数据库的连接。为了简洁起见——我不能复制和粘贴——我遗漏了一些对问题不重要的东西。这是我的 spring 配置:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="oracle.jdbc.OracleDriver" />
<property name="jdbcUrl" value="jdbc:oracle:thin:@dbServer:1521:service" />
<property name="properties">
<props>
<prop key="user">user</prop>
<prop key="password">password</prop>
</props>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.help.please" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.connection.autocommit">true</prop>
</props>
</property>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
我已将 sessionFactory
自动连接到 DAO 中。当我尝试从 sessionFactory
获取连接时,日志如下所示(再次缩短):
INFO [main] C3P0Registry:216 Initializing c3p0-0.9.2.1 [built 20-March-2013 10:47:27 +0000; debug? true; trace: 10]
INFO [main] Version:66 - HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
INFO [main] Version:54 - HHH000412: Hibernate Core {4.3.8.Final}
INFO [main] Environment:224 - HHH000205: Loaded properties from resource hibernate.properties: {hibernate.connection.driver_class=org.h2.Driver, hibernate.service.allow_crawling=false, hibernate.dialect=org.hibernate.dialect.H2Dialect, hibernate.max_fetch_depth=5, hibernate.format_sql=true, hibernate.generate_statistics=true, hibernate.connection.username=sa, hibernate.connection.url=jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE, hibernate.bytecode.use_reflection_optimizer=false, hibernate.jdbc.batch_versioned_data=true, hibernate.connection.pool_size=5}
INFO [main] Environment:346 - HHH000021: Bytecode provider name : javassist
INFO [main] AbstractPoolBackedDataSource:522 - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailer -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> [mumbo jumbo], debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> oracle.jdbc.OracleDriver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> [mumbo jumbo], idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:oracle:thin:@dbServer:1521:service, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> maxPoolSize -> 15, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, properties -> {user=****, password=********}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
WARN [main] JdbcServicesImpl:204 - HHH000342: Could not obtain connection to query metadata : ORA-01017: invalid username/password; logon denied
我成功地能够使用用户使用其他应用程序以及 SQL Developer 登录数据库。 我已经多次确定 user/password 是正确的。我试过同时使用 ojdbc6.jar
和 ojdbc7.jar
,希望它可能是那样。我做了一些研究,发现 username/password 可能会在发送到 Oracle 之前自动大写,但我知道验证这一点的方法。
可能很重要的一点是,当我使用 Spring 3 和 Hibernate 3 时,这段代码可以很好地连接到数据库。关于如何解决这个问题有什么建议吗?
编辑
请务必注意,我结合使用注释和 xml 来配置我的项目。我正在使用 @Autowired
注入我的服务、daos 和会话工厂。我在我的 dao 层中使用 @Transactional
和 @Repository
。我不知道这是否有所作为,但请在下面查看我的回答,看看我是如何让它工作的。
我发现我需要向我的 spring sessionFactory
bean 添加一个 hibernate.cfg.xml
文件。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:oracle:thin:@dbServer:1521:service</property>
<property name="connection.username">user</property>
<property name="connection.password">password</property>
<property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.autocommit">true</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.show_sql">true</property>
</session-factory>
</hibernate-configuration>
现在我的 spring 配置更改为如下所示:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="oracle.jdbc.OracleDriver" />
<property name="jdbcUrl" value="jdbc:oracle:thin:@dbServer:1521:service" />
<property name="user" value="user" />
<property name="password" value="password" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.help.please" />
<property name="configLocation">
<value>classpath:com.help.please/hibernate.cfg.xml</value>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
我不太确定为什么会这样,但是 我认为 向我解释的方式是属性并没有全部传递给Hibernate,因此像这样配置 Hibernate 和 Spring 有助于它获得所需的正确配置。如果我错了,请随时纠正我。
我的应用程序使用 Spring 4、Hibernate 4、Java 1.7。这是一个桌面应用程序而不是 Web 应用程序,因此不涉及服务器。我正在尝试创建到数据库的连接。为了简洁起见——我不能复制和粘贴——我遗漏了一些对问题不重要的东西。这是我的 spring 配置:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="oracle.jdbc.OracleDriver" />
<property name="jdbcUrl" value="jdbc:oracle:thin:@dbServer:1521:service" />
<property name="properties">
<props>
<prop key="user">user</prop>
<prop key="password">password</prop>
</props>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.help.please" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.connection.autocommit">true</prop>
</props>
</property>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
我已将 sessionFactory
自动连接到 DAO 中。当我尝试从 sessionFactory
获取连接时,日志如下所示(再次缩短):
INFO [main] C3P0Registry:216 Initializing c3p0-0.9.2.1 [built 20-March-2013 10:47:27 +0000; debug? true; trace: 10]
INFO [main] Version:66 - HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
INFO [main] Version:54 - HHH000412: Hibernate Core {4.3.8.Final}
INFO [main] Environment:224 - HHH000205: Loaded properties from resource hibernate.properties: {hibernate.connection.driver_class=org.h2.Driver, hibernate.service.allow_crawling=false, hibernate.dialect=org.hibernate.dialect.H2Dialect, hibernate.max_fetch_depth=5, hibernate.format_sql=true, hibernate.generate_statistics=true, hibernate.connection.username=sa, hibernate.connection.url=jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE, hibernate.bytecode.use_reflection_optimizer=false, hibernate.jdbc.batch_versioned_data=true, hibernate.connection.pool_size=5}
INFO [main] Environment:346 - HHH000021: Bytecode provider name : javassist
INFO [main] AbstractPoolBackedDataSource:522 - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailer -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> [mumbo jumbo], debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> oracle.jdbc.OracleDriver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> [mumbo jumbo], idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:oracle:thin:@dbServer:1521:service, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> maxPoolSize -> 15, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, properties -> {user=****, password=********}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
WARN [main] JdbcServicesImpl:204 - HHH000342: Could not obtain connection to query metadata : ORA-01017: invalid username/password; logon denied
我成功地能够使用用户使用其他应用程序以及 SQL Developer 登录数据库。 我已经多次确定 user/password 是正确的。我试过同时使用 ojdbc6.jar
和 ojdbc7.jar
,希望它可能是那样。我做了一些研究,发现 username/password 可能会在发送到 Oracle 之前自动大写,但我知道验证这一点的方法。
可能很重要的一点是,当我使用 Spring 3 和 Hibernate 3 时,这段代码可以很好地连接到数据库。关于如何解决这个问题有什么建议吗?
编辑
请务必注意,我结合使用注释和 xml 来配置我的项目。我正在使用 @Autowired
注入我的服务、daos 和会话工厂。我在我的 dao 层中使用 @Transactional
和 @Repository
。我不知道这是否有所作为,但请在下面查看我的回答,看看我是如何让它工作的。
我发现我需要向我的 spring sessionFactory
bean 添加一个 hibernate.cfg.xml
文件。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:oracle:thin:@dbServer:1521:service</property>
<property name="connection.username">user</property>
<property name="connection.password">password</property>
<property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.autocommit">true</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.show_sql">true</property>
</session-factory>
</hibernate-configuration>
现在我的 spring 配置更改为如下所示:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="oracle.jdbc.OracleDriver" />
<property name="jdbcUrl" value="jdbc:oracle:thin:@dbServer:1521:service" />
<property name="user" value="user" />
<property name="password" value="password" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.help.please" />
<property name="configLocation">
<value>classpath:com.help.please/hibernate.cfg.xml</value>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
我不太确定为什么会这样,但是 我认为 向我解释的方式是属性并没有全部传递给Hibernate,因此像这样配置 Hibernate 和 Spring 有助于它获得所需的正确配置。如果我错了,请随时纠正我。