【问题标题】:Hibernate (hbm) - refreshing set with where clause after merging the container objectHibernate (hbm) - 合并容器对象后使用 where 子句刷新集合
【发布时间】:2015-03-22 06:41:47
【问题描述】:

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

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

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

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

在一种特殊情况下,我有一个与 Document 实体具有一对多关系的 Report 实体。

因此,当我将文档标记为已删除并保存报告实体(通过合并)时,我希望报告实体不会将文档标记为已删除。但这不会发生。

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

这里是 Document 实体的 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 方法返回相同的信息,但我希望此方法只返回未删除的文档。

注意:如果我在另一笔交易中使用其他方法,我只会在没有删除文档的情况下获得报告,但我想在同一笔交易中这样做。

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

非常感谢。

【问题讨论】:

    标签: java spring hibernate merge hbm


    【解决方案1】:

    Merge 方法从传递的实体对象创建一个副本并返回它。尝试在合并后重新获取报表实体。

    【讨论】:

    • 您能告诉我应该如何重新获取报告实体吗?也许使用 Hibernate.initialize()?谢谢
    • 添加此方法,保存报表后使用,public Report refresh(Report report) { return (Report) this.currentSession().refresh(report); }
    猜你喜欢
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多