没有EntityManager的持久性提供者命名
我有我的persistence.xml具有相同的名称,在META-INF目录下使用toplink。 然后我有我的代码调用它…
EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");
但是,我收到以下错误消息
2009-07-21 09:22:41,018 [main]错误 - 没有EntityManager的持久化提供者名为agisdb javax.persistence.PersistenceException:没有名为agisdb的EntityManager的持久性提供者 在javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89) 在javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)
这里是persistence.xml …
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="agisdb"> <class>com.agis.livedb.domain.AddressEntity</class> <class>com.agis.livedb.domain.TrafficCameraEntity</class> <class>com.agis.livedb.domain.TrafficPhotoEntity</class> <class>com.agis.livedb.domain.TrafficReportEntity</class> <properties> <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/agisdb"/> <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="toplink.jdbc.user" value="root"/> <property name="toplink.jdbc.password" value="password"/> </properties> </persistence-unit> </persistence>
它应该在类路径…但是,我得到了上述错误…真的很感谢任何帮助…谢谢
在<persistence-unit name="agisdb">
,定义持久性提供者名称:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
把"hibernate-entitymanager.jar"
放在应用程序的类路径中。
对于较新的版本,您应该使用"hibernate-core.jar"
而不是弃用的hibernate-entitymanager
如果你正在运行一些IDE,比如Eclipse : Project Properties -> Java Build Path -> Libraries.
否则把它放在你的应用程序的/lib
中。
确保persistence.xml
文件位于以下目录: <webroot>/WEB-INF/classes/META-INF
我需要在我的pom.xml文件中:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.2.6.Final</version> </dependency>
也许你定义了一个像<provider>org.hibernate.ejb.HibernatePersistence</provider>
这样的<provider>org.hibernate.ejb.HibernatePersistence</provider>
但是在jar中引用另一个<provider>org.hibernate.ejb.HibernatePersistence</provider>
。 这发生在我身上:我的persistence.xml提供程序是openjpa,但我在我的类路径中使用eclipselink。 希望这个帮助!
还有一点:如果您在Eclipse RCP环境中面临这个问题,您可能必须将Factory生成从Persistence.createEntityManagerFactory
更改为new PersistenceProvider().createEntityManagerFactory
请参阅ECF关于此的详细讨论。
快速建议:
- 检查persistence.xml是否在您的类路径中
- 检查休眠提供程序是否在您的类路径中
在独立应用程序(JavaEE之外)中使用JPA时,需要在某处指定持久性提供程序。 这可以用我知道的两种方式来完成:
- 或者将提供者元素添加到持久性单元中:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
(如Chris正确答案中所述: https : //stackoverflow.com/a/1285436/784594 ) - 或接口javax.persistence.spi.PersistenceProvider的提供者必须指定为服务,请参阅: http : //docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html (通常这是包括在将hibernate或其他JPA实现包含到类路径中时
在我的情况下,我发现,由于maven misconfiguration,hibernate-entitymanager jar不包括作为依赖项,即使它是其他模块的瞬态依赖项。
如果您正在使用Eclipse,请确保排除模式不会从构建路径上的源文件夹中删除persistence.xml
。
- 转到属性 – > Java构建路径 – >源选项卡
- 检查你的排除模式,位于
MyProject/src/main/java -> Excluded: <your_pattern>
树节点 - 或者,通过选择节点并单击左侧的编辑…按钮将其设置为
Excluded: (None)
。
角落案例:如果您使用m2Eclipse,它会自动将排除在您的资源文件夹。 然后,当你尝试在eclipse中运行测试时,随后没有执行persistence.xml会产生这个错误。
确保你已经在'src'文件夹下创建了persistence.xml文件。 我在项目文件夹下创建,这是我的问题。
它发生在实体管理器试图指向许多持久性单元时。 执行以下步骤:
- 在你的编辑器中打开相关文件(假如你的项目已经在你的IDE中关闭了)
- 删除所有与持久性和实体管理器相关的代码
- 保存文件
- 在IDE中打开项目
- 现在绑定你选择的数据库或表
我遇到了同样的问题,但在EclipseLink 2.5.0版本上 。
我通过添加另一个必需的jar文件( javax.persistence_2.1.0.v201304241213.jar.jar )来解决我的问题;
罐子需要:
– javax.persistence_2.1.0.v201304241213.jar
– eclipselink.jar
– jdbc.jar(取决于使用的数据库)。
我希望这有帮助。
我也有这个错误,但问题是persistence.xml
的命名空间uri。
我将http://xmlns.jcp.org/xml/ns/persistence
替换为http://java.sun.com/xml/ns/persistence
,并将版本2.1更改为2.0。
现在正在工作。
您需要在类路径中添加hibernate-entitymanager-x.jar。
在Hibernate 4.x中,如果存在jar,那么不需要在persistence.xml文件中添加org.hibernate.ejb.HibernatePersistence。
面对同样的问题,很长一段时间找不到解决方案。 在我的情况下,它有助于取代
<provider>org.hibernate.ejb.HibernatePersistence</provider>
同
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
从这里解决了
这个问题已经得到了答复,但只是想提出一个小提示,阻止了我。 这个异常在之前的错误之后被抛出。 我得到这个:
property toplink.platform.class.name is deprecated, property toplink.target-database should be used instead.
即使我已经更改了persistence.xml以包含新的属性名称:
<property name="toplink.target-database" value="oracle.toplink.platform.database.oracle.Oracle10Platform"/>
在有关不推荐使用的属性名称的消息之后,我得到了和上面一样的PersistenceException异常,以及其他一些异常。 我的提示:确保检查异常香肠的开始。
Glassfish v2.1.1中似乎存在一个错误,重新部署或未部署,部署不会更新正在缓存某处的persistence.xml。 我不得不重新启动服务器,然后它的工作。
在OSGi上下文中,有必要在你的包的MANIFEST.MF中列出你的持久化单元,例如
JPA-PersistenceUnits: my-persistence-unit
否则,JPA bundle将不知道你的bundle包含了持久化单元。
请参阅http://wiki.eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE 。
在类路径中需要以下jar文件:
- ANTLR-2.7.6.jar
- 公地集合-3.1.jar
- dom4j的-1.6.1.jar
- 休眠公地的注解,4.0.1.Final.jar
- 休眠核心,4.0.1.Final.jar
- 冬眠,entitymanager.jar
- 冬眠-JPA-2.0-API-1.0.0.Final.jar
- Javassist进行-3.9.0.jar
- JBoss的日志记录,3.1.1.GA.jar
- JTA-1.1.jar
- SLF4J-API-1.5.8.jar
- XXX-JDBC-driver.jar
我只是将META-INF复制到src中,然后工作!
如果你使用的是Maven,可能是因为它没有在META-INF文件夹的正确位置上。 其他人提到复制文件夹,但另一种方法是告诉Maven在哪里寻找它,使用<resources>
标签。 请参阅: http : //maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html
如果Persistence.createEntityManagerFactory("JPAService")
在不同的类中有不同的名称, Persistence.createEntityManagerFactory("JPAService")
出现错误。 通过重构可以得到不同的名字 ,在我的情况。 在一个类中, private void initComponents()
,ContactsTable类中的自动生成的Persistence.createEntityManagerFactory("JPAService")
与DBManager类中的Persistence.createEntityManagerFactory("JPAServiceExtended")
不同。
休眠5.2.5
Jar文件在类路径中需要。 这是Hibernate 5.2.5最终版本的必需文件夹。 它可以从http://hibernate.org/orm/downloads/下载;
- ANTLR-2.7.7
- CDI-API-1.1
- 同学-1.3.0
- dom4j的-1.6.1
- EL-API-2.2
- Geronimo的jta_1.1_spec-1.1.1
- hibernate-commons-annotation-5.0.1.Final
- hibernate-core-5.2.5.Final
- hibernate-jpa-2.1-api-1.0.0.Final
- jandex-2.0.3.Final
- Javassist进行-3.20.0-GA
- javax.inject-1
- JBoss的拦截,api_1.1_spec-1.0.0.Beta1
- jboss-logging-3.3.0.Final
- JSR250-API-1.0
在中创建一个xml文件“persistence.xml”
YourProject / src目录/ META-INF / persistence.xml中
persistence.xml中
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1"> <persistence-unit name="sample"> <class>org.pramod.data.object.UserDetail</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/hibernate_project"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value="root"/> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="false"/> <property name="hibernate.cache.use_second_level_cache" value="false"/> <property name="hibernate.archive.autodetection" value="true"/> </properties> </persistence-unit>
- 请记下<persistance>标签中提到的信息,版本应为2.1。
- 请注意名称<persistance-unit>标签,名称被称为“样本” 。 加载你的名字时,这个名字需要完全相同
EntityManagerFactor = Persistance.createEntityManagerFactory(“sample”); 。 “样品”可以根据您的命名惯例进行更改。
现在创建一个实体类。 与我的例子UserDetail名称,在包org.pramod.data.object
UserDetail.java
package org.pramod.data.object; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "user_detail") public class UserDetail { @Id @Column(name="user_id") private int id; @Column(name="user_name") private String userName; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } @Override public String toString() { return "UserDetail [id=" + id + ", userName=" + userName + "]"; } }
现在用main方法创建一个类。
HibernateTest.java
package org.pramod.hibernate; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.pramod.data.object.UserDetail; public class HibernateTest { private static EntityManagerFactory entityManagerFactory; public static void main(String[] args) { UserDetail user = new UserDetail(); user.setId(1); user.setUserName("Pramod Sharma"); try { entityManagerFactory = Persistence.createEntityManagerFactory("sample"); EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); entityManager.persist( user ); entityManager.getTransaction().commit(); System.out.println("successfull"); entityManager.close(); } catch (Exception e) { e.printStackTrace(); } } }
输出将是
UserDetail [id=1, userName=Pramod Sharma] Hibernate: drop table if exists user_details Hibernate: create table user_details (user_id integer not null, user_name varchar(255), primary key (user_id)) Hibernate: insert into user_details (user_name, user_id) values (?, ?) successfull