【发布时间】:2012-03-15 21:12:40
【问题描述】:
我在带有软删除的 Java/Spring/Struts2 项目中使用休眠。我有两个实体的关系,我希望当我从数据库加载第一个实体时,如果相关的实体被删除,它将不会被加载。
第一个实体的注解是:
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "users")
@SQLDelete(sql = "UPDATE users SET active = '0' WHERE id_user = ?")
@Where(clause = "active = '1'")
public class User {
这是映射关系
@Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
@ManyToOne
@JoinColumn(name = "id_social_data")
@Where(clause = "active = '1'")
public SocialData getSocialData() {
return socialData;
}
以及第二个实体的映射
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "social_datas")
@SQLDelete(sql = "UPDATE social_datas SET active = '0' WHERE id_social_data = ?")
@Where(clause = "active = '1'")
public class SocialData
我启用了休眠查询日志,得到了这个
select
this_.id_user as id1_24_8_,
this_.active as active24_8_,
.....
socialdata5_.id_social_data as id1_18_3_,
socialdata5_.active as active18_3_,
.....
from
users this_
.....
left outer join
social_datas socialdata5_
on this_.id_social_data=socialdata5_.id_social_data
.....
where
(
this_.active = '1'
)
and this_.username=?
and this_.password=?
我错误地期待另一个“where”子句?为什么休眠不使用
where
(
this_.active = '1'
and socialdata5_.active = '1'
)
提前致谢,欢迎任何想法。
【问题讨论】:
-
我仍然不知道这是否可行,我正在手动处理此问题,但任何想法或指向正确文档 /bug / 票证的链接都会有所帮助。跨度>
-
您还必须注释与
@Where(clause = "active = '1'")的关系。但是,我不太喜欢这种解决方案,因为它可能容易出错且不易维护。特别是如果你有很多关系。 -
嗨@miguelcobain。第二个代码块是关系映射,已经有了`@Where注解`。尽管如此,我还是放弃了软删除,因为它只是问题的根源,我最终让用户在应用程序中手动更改活动标志。还是谢谢你
-
糟糕,很抱歉没有注意到。我也开始放弃了。
标签: hibernate jpa annotations