环境:Windows 7、NetBean 6.9(包括GlassFish v3、Java EE 6)、MySQL服务器
我已经在 MySQL 数据库中创建了表,并通过右键单击项目并选择“create entity from database
”来使用 NetBean 的功能(如果措辞有误,抱歉,因为我的 NetBean 是日文的)
这将创建实体。
现在我去测试是否可以通过Entity Manager访问DB。
Tmp.java
package local.test.tmp;
import Resources.Users;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;
/**
*
* @author m-t
*/
public class Tmp {
private static EntityManagerFactory factory;
private static final String WEB_PU = "WebApplication1PU";
public static void main(String args[]) {
factory = Persistence.createEntityManagerFactory(WEB_PU);
EntityManager em = factory.createEntityManager();
//read existing entries and write to concole
Query q = em.createQuery("select * from users");
List<Users> userList = q.getResultList();
for(Users u : userList) {
System.out.println(u);
}
}
}
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
<!-- orignal
<persistence-unit name="WebApplication1PU" transaction-type="JTA">
<jta-data-source>masatoJNDI</jta-data-source>
<properties/>
</persistence-unit>
-->
<persistence-unit name="WebApplication1PU" transaction-type="JTA">
<jta-data-source>masatoJNDI</jta-data-source>
<properties>
<property name="toplink.jdbc.user" value="masato" />
<property name="toplink.jdbc.password" value="foobar" />
</properties>
</persistence-unit>
</persistence>
当我运行 Tmp.java 时,我可以看到它在以下位置失败:
factory = Persistence.createEntityManagerFactory(WEB_PU);
错误信息:
Exception in thread "main" javax.persistence.PersistenceException: No Persistence
provider for EntityManager named WebApplication1PU
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:84)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
at local.test.tmp.Tmp.main(Tmp.java:24)
我已经检查了测试代码中持久性单元“WebApplication1PU”的拼写是否与 persistence.xml 匹配,它是正确的。
persistence.xml 位于...它是日文的我不知道英文怎么说:(
让我试试..
project
|-------web page
|-------test package
|-------lib
|-------enterprise bean
|-------*** file //blah file, I can't translate..
|-----MNIFEST.MF
|-----faces-cofig.xml
|-----persistence.xml //HERE!!
由于失败是在 Factory 尝试在 persistence.xml 中定位持久性单元的开始处,所以我完全感到困惑。有什么我应该验证的吗?
如果您需要更多说明,请告诉我。
更新
我尝试了建议的可能解决方案,但没有成功。返回相同的错误消息。 是的,netbean 6.9 默认提供程序是 toplink。
我做了什么:
将提供程序添加到 persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
<persistence-unit name="NoJSFPU" transaction-type="JTA">
<provider>oracle.toplink.essentials.PersistenceProvider</provider>
<jta-data-source>masatoJNDI</jta-data-source>
<properties>
<property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/mytest"/>
<property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="toplink.jdbc.user" value="masato" />
<property name="toplink.jdbc.password" value="mocha123" />
</properties>
</persistence-unit>
</persistence>
似乎大多数人都在我的情况下取得了成功。我现在开始考虑我运行测试文件的方式或文件所在的位置可能有问题?
我从 netbean 执行的 Tmp.java 位于:
project
|------web page
|------source package
| |-----------local.test.session
|-----------local.test.tmp
|------------------Tmp.java //HERE
不过我不确定这是否重要。
更新 2
我已经将包含 toplink-essential.jar 和 toplink-essential-agent.jar 的 toplink lib 添加到我的项目的 lib 目录中,现在我在原来的错误之上得到了新的错误,但我相信我得到了更近。
看起来 persistence.xml 中的版本属性有问题...???
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named WebApplication1PU: Provider named oracle.toplink.essentials.PersistenceProvider threw unexpected exception at create EntityManagerFactory:
oracle.toplink.essentials.exceptions.PersistenceUnitLoadingException
Local Exception Stack:
Exception [TOPLINK-30005] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: sun.misc.Launcher$AppClassLoader@f6a746
Internal Exception: Exception [TOPLINK-30004] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while processing persistence.xml from URL: file:/C:/Users/m-takayashiki/Documents/NetBeansProjects/NoJSF/build/web/WEB-INF/classes/
Internal Exception:
(1. cvc-complex-type.3.1: Value '2.0' of attribute 'version' of element 'persistence' is not valid with respect to the corresponding attribute use. Attribute 'version' has a fixed value of '1.0'.)
at oracle.toplink.essentials.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:143)
at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.createEntityManagerFactory(EntityManagerFactoryProvider.java:169)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:110)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)
at local.test.tmp.Tmp.main(Tmp.java:24)
更新 3
经过一些研究,发现版本号需要符合 1.0,所以我应用了修复程序并得到了新的错误。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 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_1_0.xsd">
<persistence-unit name="NoJSFPU" transaction-type="JTA">
<provider>oracle.toplink.essentials.PersistenceProvider</provider>
<jta-data-source>masatoJNDI</jta-data-source>
<class>local.test.session.Addresses</class>
<class>local.test.session.Users</class>
<properties>
<property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/mytest"/>
<property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="toplink.jdbc.user" value="masato" />
<property name="toplink.jdbc.password" value="mocha123" />
</properties>
</persistence-unit>
</persistence>
这很奇怪,因为我已经在上面的 persistence.xml 中指定了类:(
Exception in thread "main" javax.persistence.PersistenceException: Exception [TOPLINK-7060]
(Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.ValidationException
Exception Description: Cannot acquire data source [masatoJNDI].
Internal Exception: javax.naming.NoInitialContextException: Need to specify class name in
environment or system property, or as an applet parameter, or in an application resource
file: java.naming.factory.initial
更新 4
我不认为这被称为“已解决”,但经过长时间的尝试,我决定只在网络应用程序中运行我的测试代码,而不是从 netbean 单独运行。我必须自己创建 web.xml,因为 GlassFish 不提供它。 (我看到 sun-web.xml 但它不是替换)然后创建 servlet,在 web.xml 中定义映射并将我的测试代码片段添加到 servlet 并在浏览器上尝试。成功了,成功从数据库中获取数据。
我想知道当我尝试从 Netbean 运行 Tmp.java(我的测试文件)时它不工作的原因是什么...
最佳答案
请指定 <provider>
为你的<persistence-unit>
:
<!-- EclipseLink -->
<provider>
org.eclipse.persistence.jpa.PersistenceProvider
</provider>
<!-- Hibernate -->
<provider>
org.hibernate.ejb.HibernatePersistence
</provider>
<!-- Toplink -->
<provider>
oracle.toplink.essentials.PersistenceProvider
</provider>
并让你的 persistence-unit
名称正确,文件路径也在正确的上下文路径中。
关于java - 持久性对象无法从 persistence.xml 中找到持久性单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4435124/