2012-04-30 52 views
0

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

这很好。但是,我想知道为什么我将这个存储过程用于开放JPA的魔法? 我想,如果我有一个JPA对象,如果我想坚持到数据库使用类似于此

emf.persist(launchRet)

通话的JPA框架将检查是否记录媒体链接存在的情况下,如果是这样,它会继续对该记录进行更改,如果没有,则只会添加一条新记录。这将是非常酷的。相反,我将不得不最终在更新查询中自己编写所有这些逻辑。这很好,但为什么我不能只使用存储过程并将所有必需的值传递给它?

UPDATE:CODE解释什么是我最后的评论是关于

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

变量启动被传递到方法...

public QuickLaunch UpdateQuickLaunchComponent(QuickLaunch launch) 

我会简单刚才设置的发现推出launchRet等于到通过的发射?

回答

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),那么它被创建并持久化。

+0

那么这是好的,但是我有一个已经someExistingFoo,我想坚持吗?例如,有人通过FooId搜索someExistingFoo,如果找到了,我应该将它设置为等于已经传入的someExistingFoo对象吗?我会举一个例子来解释我在说什么。 – SoftwareSavant

+0

请参阅我对答案的编辑。 –

+0

啊哈......资本好的先生。我记得在某处读了一些关于entityManager.Merge(Object obj)的东西,我想我没有建立连接。感谢您的领导! – SoftwareSavant