2015-01-23 1 views
0

나는 Hibernate 4.3.5, Java 1.6 및 Spring 4.0.3을 사용하고있다.Hibernate (hbm) - 컨테이너 객체를 병합 한 후 where 절을 사용하여 새로 고침

나는 엔티티를 hbm을 통해 매핑했으며, 내 응용 프로그램을 논리적으로 삭제하려고합니다. 그래서 각 매핑 된 엔티티에서 엔티티가 삭제되었는지 여부를 나타내는 'deleted'라는 속성을 추가했습니다.

삭제 된 엔티티 (삭제 된 속성이 true 인 엔티티)를로드하지 않으므로 매핑 된 클래스에서 where 절을 사용 했으므로 엔티티가 논리적으로 삭제되지 않습니다.

또한 동일한 일대 다 관계에 동일한 where 절을 추가했습니다.

특정 경우에는 Document 엔터티와 일대 다 관계가있는 Report 엔터티가 있습니다.

따라서 문서를 삭제 된 것으로 표시하고 보고서 엔터티 (병합 포함)를 저장하면 보고서 엔터티가 삭제 된 것으로 표시된 문서를 유지하지 못합니다. 그러나 이것은 발생하지 않습니다.

<hibernate-mapping> 
    <class 
     name="es.entities.Document" 
     table="documents" 
     dynamic-insert="false" 
     dynamic-update="false" 
     where="deleted = 0">  

     <id name="id"> 
      <generator class="identity"/> 
     </id> 

     <property name="name"></property> 
     <property name="type"></property> 
     <property name="size"></property> 
     <property name="deleted"></property>           
    </class> 

</hibernate-mapping> 

나는 Spring 트랜잭션을 열고 서비스 (ReportService를)를 사용 :이 문서 실체에 대한 HBM입니다 여기

<hibernate-mapping> 
    <class 
     name="es.entities.Report" 
     table="reports" 
     dynamic-insert="false" 
     dynamic-update="false" 
     where="deleted = 0">  

     <id name="id"> 
      <generator class="identity"/> 
     </id> 

     <property name="title"></property> 
     <property name="deleted"></property>         

     <set 
      name="documents" 
      table="documents" 
      cascade="all" 
      lazy="false" 
      where="deleted=0"> 
      <key column="id_report"/> 
      <one-to-many class="es.entities.Document"/> 
     </set>               
    </class> 

</hibernate-mapping> 

:

는보고 실체에 대한 HBM입니다.

@Autowired 
private ReportDao reportDao; 

@Transactional 
public Report save(Report report) { 
    this.reportDao.save(report); 
} 

그리고 이것은 DAO 내가 보고서 개체 저장하는 데 사용 (ReportDao) 방법 :이 방법은

public Report save(Report report) { 
    return (Report) this.currentSession().merge(report); 
} 

내가 예를 넣어 : 내가 서비스에 보내는 매개 변수가 포함을 두 개의 Document 객체가있는보고 객체 중 하나는 삭제되고 다른 객체는 삭제됩니다. DAO 메서드는 동일한 정보를 반환하지만이 메서드는 문서 만 삭제되지 않도록 반환합니다.

참고 : 다른 트랜잭션과 함께 다른 방법을 사용하는 경우 문서가 삭제되지 않은 상태로 보고서를 얻지 만 동일한 트랜잭션에서이 작업을 수행하려고합니다.

아무도 나를 도울 수 없거나이 대안을 보여줄 수 있습니까? 병합 이외의 Session 메서드를 사용할 수 있습니까?

고마워요.

답변

1

병합 메서드는 전달 된 엔터티 개체에서 복사본을 만들어 반환합니다. 보고서 항목 병합을 다시 페치하십시오.

+0

그리고 보고서 엔티티를 어떻게 다시 가져와야합니까? 어쩌면 Hibernate.initialize()로? 감사합니다 –

+0

이 메서드를 추가하고 보고서를 저장 한 후에 사용하십시오. 공용 보고서 새로 고침 (보고서 보고서) { return (Report) this.currentSession(). refresh (report); } – Amit

관련 문제