rab*_*azl 5 java hibernate jpa one-to-many hibernate-mapping
我正在使用JPA和Hibernate作为JPA提供程序.我无法弄清楚如何配置我的实体以将休眠过滤器应用于一对多关联.
我Master收藏了一个Details.这是我的实体定义:
@Entity
public class Master extends Base {
private List<Detail> details;
@OneToMany
@OrderColumn
@JoinTable(name = "master_details")
@Filter(name = "notDeleted")
// @Where(clause = "deleted = 'false'")
public List<Detail> getDetails() {
return details;
}
public void setDetails(List<Detail> details) {
this.details = details;
}
}
@Entity
@FilterDef(name = "notDeleted", defaultCondition = "deleted = false")
public class Detail extends Base {
private Boolean deleted = false;
public Boolean getDeleted() {
return deleted;
}
public void setDeleted(Boolean deleted) {
this.deleted = deleted;
}
}
Run Code Online (Sandbox Code Playgroud)
该Base没什么特别的,但一个简单的MappedSuperClass:
@MappedSuperclass
public class Base {
private Long id;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
Run Code Online (Sandbox Code Playgroud)
当加载一个Masterby时entityManager.find(Master.class, mid),过滤器应该防止所有Details加载,但我检查了hibernate(by show_sql=true)生成的sql查询,并且在加载master的详细信息时没有添加where子句!hibernate生成的示例查询是:
select
details0_.Master_id as Master1_6_1_,
details0_.details_id as details2_1_,
details0_.details_ORDER as details3_1_,
detail1_.id as id7_0_,
detail1_.deleted as deleted7_0_,
from
master_details details0_
inner join
Detail detail1_
on details0_.details_id=detail1_.id
where
details0_.Master_id=?
Run Code Online (Sandbox Code Playgroud)
经过一些搜索后,有一些提示"按ID加载不会使用过滤器,使用查询"所以我尝试了以下但没有收益:(
entityManager.createQuery("from Master where id=" + mid).getSingleResult();
Run Code Online (Sandbox Code Playgroud)
但是,如果@Where上面的getDetails被取消注释(而不是@Filter),它的子句被添加到由hibernate生成的查询中(但我不能使用@Where)
过滤器需要手动激活:
session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");
Run Code Online (Sandbox Code Playgroud)
但过滤器需要一个参数,你似乎不需要一个参数.
所以,如果你添加
@org.hibernate.annotations.Where(clause="deleted=false")
public List<Detail> getDetails() {
return details;
}
Run Code Online (Sandbox Code Playgroud)
你应该得到一个未删除的列表Details.
我不明白为什么你会使用这个1<>0条件.
| 归档时间: |
|
| 查看次数: |
8009 次 |
| 最近记录: |