我正在使用hibernate 4.0和jpa,我有一对多的关系可以从数据库加载大量数据并将其设置为延迟加载(如下面的代码所示)
为了保持历史性,当我想删除它时,我永远不会从数据库中删除B我简单地将“已关闭”属性设置为true ...
问题是如果我尝试使用:
加载所有A实例session.createCriteria(的A.class).LIST();
对于每个实例,hibernate会延迟加载B标记为关闭的内容。我想知道是否有任何注释我可以定义只加载那些“关闭”为false的注释。 避免在我用来加载A的每个代码中指定它
public class A {
@Id
private Integer id;
private String fullName;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, targetEntity = B.class)
@LazyCollection(LazyCollectionOption.TRUE)
private List<B> series = new Vector<B>();
}
public class B {
@Id
private Integer id;
private Boolean closed;
private Date createdDate;
/**lots of other things**/
}
答案 0 :(得分:0)
我找到了答案:http://www.mkyong.com/hibernate/hibernate-data-filter-example-xml-and-annotation/
默认情况下jpa doenst允许它,但是hibernate为这种情况提供了一个注释,解决方案是:
public class A {
@Id
private Integer id;
private String fullName;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, targetEntity = B.class)
@LazyCollection(LazyCollectionOption.TRUE)
@Filter(name="bNotClosed")
private List<B> series = new Vector<B>();
}
@FilterDef(name="bNotClosed", defaultCondition="closed= :value", parameters=
@ParamDef(name="value",type="boolean"))
public class B {
@Id
private Integer id;
private Boolean closed;
private Date createdDate;
/**lots of other things**/
}
session = HibernateUtils.getSessionFactory().openSession();
session.enableFilter("bNotClosed").setParameter("value", false);
如果我的参数是一个整数,我可以把它直接放在defaultCondition =“unliked = 123”中,因此hibernate将false解释为一个类属性并转向错误所以我必须在会话创建时定义值。