【发布时间】:2014-02-26 00:53:36
【问题描述】:
我是树脂新手,正在尝试让 Hibernate 使用它。我在数据源的 JNDI 查找中遇到了一些问题。我不断收到“javax.naming.NameNotFoundException”。我有一个特殊情况,我需要通过传入 url 属性来动态创建一个 EntityManager。所以当我设置我的 web.xml 时,它看起来像这样
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://caucho.com/ns/resin">
<database jndi-name="jdbc/evolution">
<driver>
<type>org.postgresql.Driver</type>
</driver>
</database>
<ejb-server data-source="jdbc/evolution"/>
</web-app>
还有我的 persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="evolution">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!--<provider>com.caucho.amber.manager.AmberPersistenceProvider</provider>-->
<!--<jta-data-source>jdbc/evolution</jta-data-source>-->
<jta-data-source>java:comp/env/jdbc/evolution</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
</properties>
</persistence-unit>
</persistence>
这是我用来获取实体管理器的代码:
public class DatabaseConnectionFactory {
public static EntityManager createManager(String databaseName) {
EntityManagerFactory emf;
Map properties = new HashMap();
properties.put("javax.persistence.jdbc.url", "jdbc:postgresql://localhost:5432/" + databaseName);
properties.put("javax.persistence.jdbc.user", "postgres");
properties.put("javax.persistence.jdbc.password", "");
properties.put("javax.persistence.jdbc.driver", "org.postgresql.Driver");
emf = Persistence.createEntityManagerFactory("evolution", properties);
return emf.createEntityManager();
}
}
当它尝试创建实体管理器时,我得到一个
javax.naming.NameNotFoundException: java:comp/env/jdbc/evolution
我还尝试将 jdbc/evolution 放入 persistence.xml 中的 jta-data-source 标记中。奇怪的是,当我第一次在 servlet 中遇到断点并通过 InitialContext 自己查找“java:comp/env/jdbc/evolution”对象时,它会找到它,但是一旦它进入休眠代码,它就不能了。有人知道为什么吗?
【问题讨论】:
标签: hibernate web.xml persistence.xml resin