【发布时间】: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