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 合并。
我正在使用 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 合并。