2012-05-07 3 views
0

테이블간에 OneToMany 연결이 있습니다. 결과ResultAux. ResultAux 개체 집합을 검색 할 수 있습니다 결과. 그 후 ResultAux 개체를 설정하고 각 설정 항목에 merge을 사용하여 변경 내용을 데이터베이스로 플러시합니다. 이처럼 : 내가 알아야 할 몇 가지 추가 작업을 위해최대 절전 모드 : 새 레코드 또는 이전 레코드

Set<ResultAux> resultAuxes = result.getResultAuxes(); 
if (resultAuxes != null) { 
    for (ResultAux resultAux : resultAuxes) { 
     resultAux = getDaoFactory().getResultAuxDAO().merge(resultAux); 
    } 
} 

항목에 새로운 기록을 설정하고 테이블에 삽입됩니다 또는 업데이트됩니다 오래된 하나 (변경 없음)입니다. 나는 모든 항목이 ResultAux 세트가 이미 ID를 가지고 있다는 것을 알아 차 렸습니다. 따라서 null을 다른 테이블과 마찬가지로 확인할 수 없습니다. 그런 것을 결정할 방법이 있습니까 (prefferably 여분의 libs를 포함하지 않음)?

편집 :

<hibernate-mapping> 
    <class name="ResultAux" table="RESULT_AUX"> 
     <id name="id" column="ID"> 
      <generator class="native" /> 
     </id> 

     <property name="additinalInfoType" column="AITYPE" type="dao.hibernate.utl.AdditinalInfoEnumType" /> 
     <property name="sorter" column="SORTER" /> 
     <property name="value1" column="VAL1" /> 
     <property name="value2" column="VAL2" /> 

     <many-to-one name="result" column="RESULT_ID" class="Result" /> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping> 
    <class name="Result" table="RESULT"> 
     <id name="id" column="ID"> 
      <generator class="native" /> 
     </id> 

     <property name="questionNumber" column="Q_NUM" /> 
     <property name="answerNumber" column="A_NUM" /> 
     <property name="questionGroup" column="Q_GRP" /> 
     <property name="answerValue" column="A_VAL" /> 
     <set name="resultAuxes" inverse="true" cascade="all-delete-orphan" 
      lazy="false"> 
      <key column="RESULT_ID" /> 
      <one-to-many class="ResultAux" /> 
     </set> 
    </class> 
</hibernate-mapping> 
+0

비 지속 엔터티에 ID가 설정되어 있지 않다고 말했을 것입니다. 세트의 모든 항목에 ID가 있는지 확실합니까? – sp00m

+1

나는 당신이 resultAux에서 병합을 사용하지 않아야한다고 생각하지만, 결과 클래스에서 최대 절전 모드는 일대 다 관계를 처리해야한다. 맵핑 구성도 게시 할 수 있습니까? –

+0

@ sp00m : 최대 절전 모드가 내 장점이 아닙니다. Result 개체에서 검색 한 ResultAux 집합에 항목을 추가 할 때 어떤 일이 발생하는지에 대한 의문이 생깁니다. 또한 결과 집합은 주어진 코드 위에 유지됩니다. 아마도이 코드 실행 시점에서 ResultAux가 지속되도록 만드는 것이 계단식 일 것입니다. –

답변

0

는 최대 절전 모드가 기본이되는 DB의 기능에 따라 identity, sequence 또는 hilo 약동학 발전 전략으로 선택됩니다.

Set<ResultAux> resultAuxes = result.getResultAuxes(); 
ResultAux newResultAux = new ResultAux(); 

/** 
* As session.save() requires to return the ID for the saved instance , if "sequence" strategy is 
* used , Hibernate will hit the DB to select the next ID (eg. select some_seq.NEXTVAL) to be used 
* for the saved instance. So newResultAux will have an ID after save() but actually it is not saved to 
* the DB yet as saving to the DB occurs during session.flush() 
*/ 
session.save(newResultAux); 
resultAuxes.add(newResultAux); 

:

나는 다음과 같은 코드로 (할당 된 ID를 가질 수있는 DB에 삽입되지 않은 레코드)이 문제가 발생할 수 있도록 선택 "순서"전략을 최대 절전 DB에 대한 생각 해결책 중 하나는 ResultAux@Version 속성을 추가하는 것입니다. 그런 다음이 @Version 속성의 값을 확인하여 새 레코드인지 여부를 확인하십시오. 새 레코드에 대한 @Version 속성은 NULL이어야합니다.

+0

사실 나는 최대 절전 모드에서 SQL 로깅을 사용하도록 설정했습니다. 새 레코드에 대해 생성 된 SQL 문은 ID가 null 인 삽입입니다. 따라서 문제의 코드 앞에 삽입이 삽입되어야합니다. 어떻게 생각해? –

+0

null ID가있는 INSERT SQL이 발행 된 경우이 레코드는 이미 삽입되어 있고 물론 ID가 있습니다. 실제로 무엇을 결정 하시겠습니까? 방금 삽입 된 레코드를 결정하거나 테이블에 삽입 될 레코드를 결정합니까 ?? –

+0

ResultAux-es를 지속하는 코드를 주석 처리하려고했습니다. 그것에 상관없이 작동합니다.그래서 나는 옳았다. 내가 sp00m 동면은 내 강한 측면이 아니라고 말했다. 질문은 꺼져 있습니다. 감사! –

0

내 대답은 문제를 해결할 수 있지만, 당신의 아이 엔티티를 유지하기 위해이 같은 일을했을 것 @EugenioCuevas 코멘트에 돌아올 확실하지 않다 :

Set<ResultAux> resultAuxes = result.getResultAuxes(); 
if (resultAuxes != null) { 
    for (ResultAux resultAux : resultAuxes) { 
     resultAux.setResult(result); 
    } 
} 
getDaoFactory().getResultDAO().merge(result); 

Hibernate는 그 자체로 관계를 관리해야한다. 하여 주 키 생성 전략으로 native를 사용