Hibernate (hbm) - 合并容器对象后使用 where 子句刷新集合

Hibernate (hbm) - refreshing set with where clause after merging the container object

我正在使用 Hibernate 4.3.5、Java 1.6 和 Spring 4.0.3。

我已经通过 hbm 映射了实体,我希望我的应用程序可以使用逻辑删除。 因此,在每个映射的实体中,我添加了一个名为 'deleted' 的 属性,它指示实体是否被删除。

因为我不想加载已删除的实体(真正删除的实体 属性),我在映射 类 中使用了 where 子句,所以我只得到实体未按逻辑删除。

此外,我还为每个一对多关系添加了相同的 where 子句。

在一个特定情况下,我有一个与文档实体具有一对多关系的报告实体。

因此,当我将文档标记为已删除并保存报告实体(合并)时,我预计报告实体不会保留标记为已删除的文档。但这并没有发生。

这是报告实体的 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:

<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>

我使用服务 (ReportService) 打开一个 Spring 事务。方法是:

@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);
}

我举个例子: 我发送给服务的参数包含一个 Report 对象,它有两个 Document 对象,其中一个已删除,另一个未删除。 DAO方法returns同样的信息,但是我想这个方法returns只是文件没有被删除。

注意:如果我对另一笔交易使用另一种方法,我得到的报告只有文档没有被删除,但我想在同一笔交易中这样做。

任何人都可以帮助我或告诉我替代方案吗?是否可以使用合并以外的其他 Session 方法?

非常感谢。

Merge 方法从传递的实体对象创建一个副本,return 它。尝试重新获取报告实体 post 合并。