我正在使用tomcat(web.xml,context.xml,hibernate.cfg.xml和persistence.xml)上的hibernate项目中的四个配置文件来定义我的数据源到H2数据库。在定义数据源时使用这四个配置文件对我来说并不清楚。
例如,我在persistence.xml属性或context.xml中定义了usename和password。我找到了以不同方式定义的不同样本。
以下是我对这些文件的设置,它引出了以下异常
(javax.persistence.PersistenceException) javax.persistence.PersistenceException:
org.hibernate.exception.GenericJDBCException: Could not open connection
由此嵌套异常引起的
org.apache.tomcat.dbcp.dbcp.SQLNestedException:
Cannot create JDBC driver of class '' for connect URL 'null'
我的web.xml
<env-entry>
<env-entry-name>name</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>Tomcat</env-entry-value>
</env-entry>
<listener>
<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
<listener>
<description>PersistenceListener</description>
<listener-class>test.sample.raindance.hibernate.PersistenceListener</listener-class>
</listener>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/MyApp</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
context.xml中
<Context antiJARLocking="true" path="/">
<Resource
name="jdbc/MyApp"
auth="Container"
type="javax.sql.DataSource"
username="sa"
password=""
driverClassName="org.h2.Driver"
url="jdbc:h2:~/test;AUTO_SERVER=TRUE"
maxActive="8"
maxIdle="4"
maxWait="10000"/>
的hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="dialect">org.hibernate.dialect.H2Dialect</property>
<property name="current_session_context_class">thread</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.max_fetch_depth">3</property>
<property name="connection.datasource">java:/comp/env/jdbc/MyApp</property>
<!-- Mapping files -->
<mapping class="test.sample.raindance.hibernate.Game"/>
</session-factory>
</hibernate-configuration>
的persistence.xml
<persistence-unit name="hibernate-test" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>java:/comp/env/jdbc/MyApp</non-jta-data-source>
<class>test.sample.raindance.hibernate.Game</class>
<properties>
<property name="hibernate.connection.datasource" value="java:/comp/env/jdbc/MyApp"/>
<property name="hibernate.id.new_generator_mappings" value ="true"/>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<!-- <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> -->
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
<property name="connection.autocommit" value="false"/>
</properties>
</persistence-unit>
</persistence>
这些设置出了什么问题!可能是我写的是错误的属性或错误的设置文件。
感谢您的帮助
答案 0 :(得分:0)
将其保留在上下文文件中。用户名和密码不是您的持久层或Web应用程序所关注的问题。您的网络应用程序只关心拥有资源。
这样,身份验证就会与您的数据源保持一致,在我看来,这更有意义。
答案 1 :(得分:0)
我以这种方式为tomcat 7的hibernate应用程序定义了我的数据源:
使用context.xml定义数据源,数据库驱动程序,用户名和密码等。它应该放在webrAchive
中的/META-INF/context.xml中<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/MyApp">
<Resource
name="jdbc/MyApp"
auth="Container"
type="javax.sql.DataSource"
username="sa"
password=""
driverClassName="org.h2.Driver"
url="jdbc:h2:~/test;AUTO_SERVER=TRUE"
maxActive="8"
maxIdle="4"
maxWait="10000"/>
</Context>
使用web.xml将您的数据源引入带有resource-ref标记的web.xml。它应该放在webrAchive的/WEB-INF/web.xml中
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<env-entry>
<env-entry-name>name</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>Tomcat</env-entry-value>
</env-entry>
<listener>
<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
<listener>
<description>PersistenceListener</description>
<listener-class>test.sample.raindance.hibernate.PersistenceListener</listener-class>
</listener>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/MyApp</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
直到此时,所有设置都与您的容器相关,而hibernate对此连接一无所知。 persistence.xml将引入此连接到hibernate引擎。它应该放在webrAchive中的/WEB-INF/classes/META-INF/persistence.xml中
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="hibernate-test" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>java:comp/env/jdbc/MyApp</non-jta-data-source>
<class>test.sample.raindance.hibernate.Game</class>
<properties>
<property name="hibernate.id.new_generator_mappings" value ="true"/>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
<property name="connection.autocommit" value="false"/>
</properties>
</persistence-unit>
</persistence>
不需要hibernate.cfg.xml