JPA 和 Play 框架:EntityManager 没有名为更新的持久性提供程序
Posted
技术标签:
【中文标题】JPA 和 Play 框架:EntityManager 没有名为更新的持久性提供程序【英文标题】:JPA and Play Framework: No Persistence provider for EntityManager named update 【发布时间】:2012-07-03 14:48:32 【问题描述】:使用播放!框架 2.0.2,当我将 java 项目中的几个项目添加到我的 H2 测试数据库时,我在 ITEM 表中只看到一个项目。单个项目是我坚持的最后一个条目。我认为这是由于每次提交时都会重新创建数据库。因此,我想在我的 application.conf 文件中添加 JPA.ddl=update 属性。但这只是因以下错误而中断。什么
这是我的代码(在 Item.save() 方法中):
package models;
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Persistence;
@Entity
public class Item
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int id;
public String name;
public String dev;
public String type;
public int quantity;
public BigDecimal unitPrice;
public Item()
public Item(String name, String dev, String type, int quantity,
BigDecimal unitPrice)
super();
this.name = name;
this.dev = dev;
this.type = type;
this.quantity = quantity;
this.unitPrice = unitPrice;
/**
* Insert this new computer.
*/
public void save()
//this.id = id;
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("defaultPersistenceUnit");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(this);
entityManager.getTransaction().commit();
entityManager.close();
这是错误信息
Caused by: javax.persistence.PersistenceException: No Persistence provider for EntityManager named update
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:69) ~[hibernate-jpa-2.0-api-1.0.1.Final.jar:1.0.1.
Final]
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) ~[hibernate-jpa-2.0-api-1.0.1.Final.jar:1.0.1.
Final]
at play.db.jpa.JPAPlugin.onStart(JPAPlugin.java:35) ~[play_2.9.1.jar:2.0.2]
at play.api.Play$$anonfun$start$1.apply(Play.scala:60) ~[play_2.9.1.jar:2.0.2]
at play.api.Play$$anonfun$start$1.apply(Play.scala:60) ~[play_2.9.1.jar:2.0.2]
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59) ~[scala-library.jar:0.11.3]
【问题讨论】:
只是好奇,如果您正在测试 P2,为什么不使用 Ebean 呢? 我没有深入研究 Ebean,因为我想我在某处读到它仍然是实验性的。您是说使用 Ebean 比使用这种方法更有利吗? 如果我不需要的话,我无法想象使用 JPA,如果我可以在 P2 中使用 Ebean,那肯定会更舒服。不,它不是实验性的,它已经完全实现,并且 P2 正在使用稳定版本的 Ebean。我建议观看示例应用程序(即 java 的计算机数据库)并至少将 Ebean 带到试驾 我不能同意这里 - Ebean 已经过时(不支持 JPA 2,只有 1,并且只有部分),记录不良,开发似乎已经停滞。由于小问题在这里和那里偷走时间,这通常是一种痛苦。检查 Play 邮件列表:Ebean 将被 JPA 替换为 Play 2.3 中的默认 ORM。 【参考方案1】:我相信您需要将 persistence.xml 文件包含在您的 /conf/META-INF/ 目录中,并从那里定义一个持久性单元。我相信这是因为您使用的是 Hibernate 正确吗?
您的外观示例
<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="update">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.connection.url" value="jdbc:h2:mem:events"/>
</properties>
</persistence-unit>
</persistence>
在您的标签中,您还需要包含您要使用的任何 <jar-file>
或 <class>
。
【讨论】:
是的,杰夫。我正在使用休眠。我发现我的问题出在我的 persistence.xml 文件中。我错误地将 hibernate.hbm2ddl 的值设置为“create-drop”。当我将其更改为“更新”时,一切正常,就像在您的示例中一样。此外,我必须删除配置文件 /META-INF/application.conf 中的条目,其中我声明了 jpa.ddl=update。谢谢以上是关于JPA 和 Play 框架:EntityManager 没有名为更新的持久性提供程序的主要内容,如果未能解决你的问题,请参考以下文章
JPA 和 Play 框架:EntityManager 没有名为更新的持久性提供程序