2012-10-27 2 views
6

최대 절전 모드 4.1.7을 사용하고 개체 업데이트를 시도하고 있지만 어떻게 수행해야하는지 문서가 없습니다. 현재, 나는이 일을하고있다 : 또한EntityManager를 사용하여 최대 절전 모드로 업데이트

public Person getPersonById(int id) { 
     personQuery = entityManager.createNamedQuery("Person.findPerson", Person.class); 
     personQuery.setParameter("id", id); 
     return personQuery.getSingleResult(); 
    } 

I가 Person 클래스 내부에 정의 된 명명 된 질의하고 있습니다 : PersonDao getPersonById에서

public Person update(Person person) { 
     return entityManager.merge(person); 
    } 

은 다음과 같은 PersonDao 업데이트에서

Person person = personDao.getPersonById(1); 
    person.setAge(23); 
    person.setLastname("McName"); 
    person = personDao.update(person); 

보인다 여기 :

@NamedQuery(name="Person.findPerson", query="SELECT p FROM Person p WHERE p.id = :id") 

내 사람이 업데이트되지 않는다는 것을 사용하여 최대 절전 모드를 사용하여 업데이트를 구현하는 방법은 무엇입니까?

+0

위의 코드는 모든 단일 트랜잭션에서 실행되는 경우 personDao.update()'에 대한 호출이'완전히 불필요한 것을 제외하고, OK입니다 : 엔티티의 상태는 /에 최대 절전 모드 JPA에 의해 영속화 자동으로됩니다 트랜잭션의 끝. getPersonById 메소드는 엔티티가 이미로드 된 경우 쿼리를 실행하지 않으므로보다 간단하고 효율적일 수있는'em.find (Person.class, id)'로 축소 될 수 있습니다. –

+0

부록 : 이것은 설명서에서 확실히 설명됩니다. http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#d5e772 –

답변

4

두 가지 시나리오가 나타날 수 있습니다.

개체의 속성과 해당 속성 만 변경할 수 있습니다.

이 경우에는 찾기, 수정, 플러시, 커밋과 같은 방법을 사용하고 싶습니다.

em.find(Person.class, person.getId()) 
person.setStatus("ACTIVE"); 
em.commit();//implicitly flushes if flush mode is COMMIT or AUTO. 

개체 속성을 사용하여 항목을 업데이트 할 수 있습니다.

경우에 따라 병합, 선택적으로 수정, 플러시, 커밋을 사용하려고합니다.

em.merge(person); 
//modify person if you wish. 
em.commit();//implicitly flushes if flush mode is COMMIT or AUTO. 
+0

마지막으로 내 솔루션을 찾았습니다. entityManager.getTrasaction(). begin(); person = entityManager.find (Person.class, id); entityManager.merge (사람); // 사람 데이터 수정 entityManager.getTransaction(). commit(); – Timo

+0

솔루션을 찾았 기쁘다. find (Person.class, id) 중에 사용 된 id가 merge (person)를 수행 할 때 사용되는 person.id 인 경우 병합이 필요하지 않을 수 있습니다. 찾기를 수행하면 엔티티가 관리되고 변경 사항을 수정하고 커밋 할 수 있습니다. – dseibert

0

난 당신이 정확히 요구하는지 모르겠지만, 당신의 방법, Person.getPersonById(int id), 당신은 다음과 같이 코드를 단순화 할 수 있습니다 :

return entityManager.find(Person.class, id); 
1

최대 절전 모드와 다른 JPA 구현은 자동으로 개체의 상태를 관리 변경 사항이 트랜잭션에 포함되어 있으면 데이터베이스에 저장하십시오. merge 또는 update 메서드를 명시 적으로 호출 할 필요가 없습니다.

EntityTransaction tx = entityManager.getTransaction(); 
tx.begin(); 
Person person = personDao.getPersonById(1); 
person.setAge(23); 
person.setLastname("McName"); 
tx.commit(); 

모든 수정 사항이 자동으로 데이터베이스에 저장됩니다

당신이 (JTA 트랜잭션 관리자에 의해 관리되지 않음) 자원 로컬 트랜잭션을 사용하는 경우는 다음과 같이하십시오.

JTA를 사용하는 경우 다른 방법으로 트랜잭션 경계를 표시해야합니다 (예 : Spring AOP @Transactional 주석 사용).

+0

hsqldb (resource-local)을 사용하고 있으며 다음 코드를 사용하여 예외가 발생했습니다 : org.hibernate. PersistentObjectException : persist에 전달 된 분리 된 엔티티 : com.application.model.Person – Timo

+0

아마도 두 개의 EntityManager 인스턴스를 사용하고있을 것입니다. – Jarek

관련 문제