Hibernate + Spring:无法过滤延迟加载的集合

时间:2015-03-15 13:08:25

标签: java spring hibernate hibernate-session

我正在使用Spring和Hibernate为我的实体实现软删除逻辑。我使用@Filter Hibernate注释来执行此逻辑。 但是有一个我无法解决的问题:延迟加载的集合中的对象被而不是过滤。

代码非常简单:

@Entity
@Table(name = "orders")
public class Order { 

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "order")
  @Filter(name = "deletedOrderItemFilter", condition = "0 = deleted")
  private Set<OrderItem> orderItems;    

  // getter and setter
}

@Entity
@Table(name = "order_item")
@FilterDef(name = "deletedOrderItemFilter", defaultCondition = "0 = deleted")
public class OrderItem {

  @ManyToOne
  @JoinColumn(name = "orderId", nullable = false)
  private Order order;

  @Column(name = "deleted")
  private boolean deleted;

  // getters and setters
}

所以逻辑是“当打开订单对象时,不会显示已删除的 OrderItem s” 这是DAO中返回Session对象的方法。 Session工厂是Spring的org.springframework.orm.hibernate4.LocalSessionFactoryBean。

public Session getSession() {
  Session session = sessionFactory.getCurrentSession();
  session.enableFilter("deletedOrderItemFilter");
  return session;
}

因此,当我请求订单列表时,才会显式调用此方法。但有趣的是,我的 orderItems 列表的PersistenceSet似乎有一个 null 会话(这很奇怪,因为我没有得到任何LazyInitializationException)。因此过滤器“deletedOrderItemFilter”不会应用于orderItems列表。

我当然用谷歌搜索了一下,我发现只要交易我的订单列表关闭,会话也已关闭。但我仍然找不到任何解决方案。 我试图明确地将一个新的临时会话分配给PersistenceSet(在获取它时)但仍然没有运气(尽管会话工厂似乎在过滤器列表中有我的过滤器)。

任何帮助都将不胜感激。

更新好的我可以用“肮脏”的方式解决它:

  • OrderItem使用Removable
  • 等方法实现我自己的界面isRemoved
  • orderItems getter调用公共过滤方法中迭代项目并过滤它们。 缺点是我必须从数据库加载所有对象 - 删除而不是 - 。

更新 由于sessionFactory Spring bean配置属性,我没有得到任何LazyInitializationException

<prop key="hibernate.enable_lazy_load_no_trans">true</prop>

所以我想:没有交易 - 没有会话 - 没有应用过滤器。

0 个答案:

没有答案