2011-01-09 2 views
3

나는 Hibernate (처음으로 데이터베이스 측)로 작업하려고하고있다. 그리고 saveOrUpdate 나 Save.Update를 사용할 수있는 가장 좋은 방법을 선택하는 방법도있다. 나는 목적지 POJO 클래스와 그 다른 속성을 가지고있다. Destination 엔티티와 함께 ​​업데이트해야합니다. 가져올 XML 파일을 가져 오는 중입니다. 대상 클래스를 특성 클래스와 함께 업데이트/저장하려면 다음 코드를 사용하고 있습니다.Hibernate saveorUpdate 메소드 문제

try{ 
     getSessionFactory().getCurrentSession().beginTransaction(); 
     getSessionFactory().getCurrentSession().saveOrUpdate(entity); 
     getSessionFactory().getCurrentSession().getTransaction().commit(); 
     } 
     catch(Exception e){ 
      getSessionFactory().getCurrentSession().getTransaction().rollback(); 
     } 
     finally{ 
      getSessionFactory().close(); 
     } 

모든 것을 나중에 내가 그것을 나에게 다음과 같은 오류를주는 특정 속성의 대상 PO를 업데이트 같은 XML 파일을 사용하고 때 내가 instance.but 동일한 세션을 사용하고 미세 전까지를하고있다. 나는 내가 secodn 경우 최대 절전 모드에서 것을 이해할 수 unique.but입니다 대상 ID가 대상 테이블과 대상 테이블의 기본 키로 UUID를 사용하고

SEVERE: Duplicate entry 'MNLI' for key 'DESTINATIONID' 
9 Jan, 2011 4:58:11 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions 
SEVERE: Could not synchronize database state with session 
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114) 
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109) 
    at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2242) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2678) 
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79) 

이미 존재하는 경우 찾을 수 없습니다 DB에있는 동일한 대상에 대한 항목이며 업데이트보다는 insert 문을 실행하려고합니다.

한 가지 가능한 해결책은 주어진 ID가 이미있는 대상이 이미 있는지 확인하고 결과를 바탕으로 저장 또는 업데이트 명령을 실행할 수 있는지 여부입니다. 내 질문은 다른 어떤 좋은 방법으로도 달성 할 수 있습니까 ..? 사전 saveOrUpdate() 작동

+0

세션에서 getSessionFactory(). getCurrentSession()을 (를) 변수에 사용하는 이유는 무엇입니까? – Baz1nga

+0

세션을하고 있습니까? Save() ?? – Baz1nga

+0

@ User350374; 단지 목적을 테스트하기 위해이 메서드를 사용한다. saveOrUpdate()를 사용하고있다 –

답변

2

의미에서

덕분에 (11.7. Automatic state detection 참조) 다음입니다 : 객체가이 세션에서 이미 지속적

  • 경우 다른 객체가 관련된 경우, 아무것도에게
  • 을하지 않는다 세션에 동일한 식별자가있는 경우
  • 개체에 식별자 속성이없는 경우 save()
  • 개체의 식별자에 새로 인스턴스화 된 개체에 할당 된 값이있는 경우 save()
  • 개체의 버전이 또는로 지정되고 version 속성 값이 새로 인스턴스화 된 개체에 할당 된 값과 같으면 save()는
  • 그렇지 않으면 (업데이트)

그래서, 그것은 기본 키 또는 버전 값이 XML 파일을 가져 오는 동안 손실과 같은 객체.

+0

그렇다. 우리가 타드 파티 시스템에서 XML을 얻고 있기 때문에 프라이 머리 키를 얻을 기회가 없기 때문에 나는 ablout 버전 값을 알고있다. 이걸 사용하는 방법을 잘 모르겠지만 .. 내가 알레시를 통해 문서를 만들었지 만, 우리가 업데이트를 위해 두 번째 XML을 얻는 지 확신 할 수 없기 때문에 여전히 내 사건을 처리하는 방법이 명확하지 않습니다. –

+0

@umesh : XML에 기본 키가없고 대상 ID로 식별되는 경우 예, 동일한 대상 ID가 먼저있는 기존 개체의 기본 키를 결정해야합니다. – axtavt

+0

감사합니다. 저는 타사 XML에서 보내는 타임 스탬프와 같은 버전 관리 트릭을 사용하여 다른 방법으로 생각할 수 있습니다. –