【问题标题】:JPA persist not writing to databaseJPA坚持不写入数据库
【发布时间】:2012-12-01 13:44:13
【问题描述】:

我只是想了解 JSF 和 JPA,但每当我尝试将对象持久保存到数据库中时,它似乎并没有写掉。 这是我正在使用的代码:

@Named
@ManagedBean
@SessionScoped
public class BestemmingController implements Serializable{

@PersistenceUnit(unitName="RealDolmenTravelShopPU")
@PersistenceContext(unitName="RealDolmenTravelShopPU")

EntityManagerFactory emf = null;
public void submit(){


        try{
            emf = Persistence.createEntityManagerFactory("RealDolmenTravelShopPU");

            EntityManager em = emf.createEntityManager();

            //EntityTransaction et = em.getTransaction();
            //et.begin();

            Bestemming nieuweBestemming = new Bestemming();

            Land gezochtLand = em.find(Land.class, selectedLand);

            nieuweBestemming.setLand(gezochtLand);
            nieuweBestemming.setNaam(bestemmingNaam);

            em.persist(nieuweBestemming);

            //et.commit();
            //em.flush();
            em.close();
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            emf.close();
        }
    }

我尝试使用 EntityTransaction,但它只是停止了我的应用程序,没有任何错误或任何东西。所以我把它留了下来,但它仍然没有写掉。 所以然后我尝试单独调用flush,但这也没有做任何事情。 我真的很困惑为什么这不起作用。这可能是一些新手的错误,但如果这里有人可以帮助我,我会很高兴的。

提前致谢!

【问题讨论】:

  • 除非使用允许非事务性写入的 JPA 实现(例如 DataNucleus JPA),否则您必须有一个事务才能将数据写入数据存储(根据 JPA 规范)。使用该路线解决您的错误
  • @DataNucleus 我尝试将交易重新放回,还尝试使用以下命令将一些文本回显到我的页面:FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"abcd", "dcba")); 当我忽略交易时,它会显示消息,否则不会...
  • 显示你的persistence.xml,你使用什么JPA impl?
  • @xeye 这是我的persistence.xml:<persistence-unit name="RealDolmenTravelShopPU" transaction-type="JTA"> <jta-data-source>realdolmentravel</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="eclipselink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence>

标签: java jpa eclipselink


【解决方案1】:

首先,您可以写入日志吗?在指定持久性单元使用 JTA 时启动事务将引发异常,因此很可能您刚刚在容器日志文件中丢失了异常。

其次,这是一个 JTA PU,因此它需要启动一个与 EM 关联的 JTA 事务,并且您将希望注入 em 而不是自己创建工厂。首先在此处查看 JPA 应用程序服务器示例,了解它们是如何设置的: http://wiki.eclipse.org/EclipseLink/Examples/JPA

【讨论】:

  • 是的,我刚刚发现自己,我打算把它贴在这里。我将 JTA 设置为 RESOURCE_LOCAL,它解决了问题。
【解决方案2】:

嘿,我发现了事务没有运行的原因:我使用的实现没有使用 JTA,它使用了 RESOURCE_LOCAL 持久性单元。这是我在设置项目时刚刚查看的内容。

幸好我的朋友让我检查服务器日志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2013-10-28
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多