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>

在您的标签中,您还需要包含您要使用的任何 &lt;jar-file&gt;&lt;class&gt;

【讨论】:

是的,杰夫。我正在使用休眠。我发现我的问题出在我的 persistence.xml 文件中。我错误地将 hibernate.hbm2ddl 的值设置为“create-drop”。当我将其更改为“更新”时,一切正常,就像在您的示例中一样。此外,我必须删除配置文件 /META-INF/application.conf 中的条目,其中我声明了 jpa.ddl=update。谢谢

以上是关于JPA 和 Play 框架:EntityManager 没有名为更新的持久性提供程序的主要内容,如果未能解决你的问题,请参考以下文章

JPA 和 Play 框架:EntityManager 没有名为更新的持久性提供程序

在 jpa play 框架中按字段查找

JPA criteria 查询:类型安全与面向对象

Play Framework 1 使用啥来实现 ORM?

使用“in”在 Play Framework 1.x / JPA 中构建查询的更简单方法?

有没有相当于Play的桌面!框架?