【问题标题】:persisting an update query using openJPA使用 openJPA 持久化更新查询
【发布时间】:2012-04-30 18:13:08
【问题描述】:

我正在尝试使用 JPA 更新现有记录。以下链接似乎表明更新记录的唯一方法是为其编写更新查询 enter link description here

这很好。但是再次,我想知道为什么我要把它从存储过程中取出来使用开放 JPA 的所有魔力? 我想如果我有一个 JPA 对象的实例,如果我尝试使用类似于此的调用将其持久化到数据库中

emf.persist(launchRet)

JPA 框架将检查记录是否已经存在,如果存在,它将继续对该记录进行更改,如果不存在,它将添加一条新记录。这真的很酷。相反,我将不得不自己在更新查询中编写所有这些逻辑。这很好,但是为什么我不能只使用存储过程并将所有必要的值传递给它?

更新:代码解释了我最后的评论是关于什么的

    try{
        launchRet = emf.find(QuickLaunch.class, launch.getQuickLaunchId());
        if(launchRet==null){                
            emf.getTransaction().begin();
            emf.persist(launchRet);
            emf.getTransaction().commit();
        }
        else{
            emf.refresh(launchRet);
        }
    }

变量launch被传入方法中...

public QuickLaunch UpdateQuickLaunchComponent(QuickLaunch launch) 

我是否可以简单地将找到的启动 launchRet 设置为等于传入的启动?

【问题讨论】:

    标签: persistence jpa-2.0


    【解决方案1】:

    阅读您发布的链接:

    您可以通过以下方式修改实体实例:

    • 使用更新查询
    • 使用实体的公共 API [...]

    99%的情况下使用的方式是第二种方式:

    Foo someExistingFoo = em.find(Foo.class, someExistingFooId);
    someExistingFoo.setSomeValue(theNewValue);
    // no need to call any persist method: the EM will flush the new state 
    // of the entity to the database when needed
    

    当然,实体也可以通过查询或通过实体图导航来加载。

    如果您有一个分离的实体,并且您希望将其状态保存到数据库中,请使用EntityManager.merge() 方法。它找到与作为参数传递的分离实体具有相同 ID 的实体,将状态从分离实体复制到附加实体,并返回附加实体:

    Foo attachedModifiedFoo = em.merge(detachedFoo);
    

    如果分离的实体不是持久的(即没有任何 ID),则创建它并使其持久。

    【讨论】:

    • 那很好,但是我已经有一个 someExistingFoo 并且我想坚持它是什么?例如,有人通过 FooId 搜索 someExistingFoo,如果找到,我是否应该将其设置为等于已经传入的 someExistingFoo 对象?我将发布一个示例来解释我在说什么。
    • 啊哈哈...资本好先生。我记得在某处的 entityManager.Merge(Object obj) 上读过一些东西,我想我没有建立联系。感谢您的提醒!
    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多