Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 冬眠+;Spring:无法筛选延迟加载的集合_Java_Spring_Hibernate_Hibernate Session - Fatal编程技术网

Java 冬眠+;Spring:无法筛选延迟加载的集合

Java 冬眠+;Spring:无法筛选延迟加载的集合,java,spring,hibernate,hibernate-session,Java,Spring,Hibernate,Hibernate Session,我正在使用Spring和Hibernate为我的实体实现软删除逻辑。我使用@Filter Hibernate注释来执行此逻辑。 但有一个问题我无法解决:延迟加载集合中的对象未被过滤 代码非常简单: @Entity @Table(name = "orders") public class Order { @OneToMany(fetch = FetchType.LAZY, mappedBy = "order") @Filter(name = "deletedOrderItemFilte

我正在使用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
}
因此,仅当我请求顺序列表时,才显式调用此方法。但有趣的是,我的orderItems列表的PersistenceSet似乎有一个null会话(这很奇怪,因为我没有得到任何
LazyInitializationException
)。因此过滤器“deletedOrderItemFilter”不应用于
orderItems
列表

当然,我已经在谷歌上搜索过了,我发现一旦我获得订单的交易关闭,会话也关闭了。但我仍然找不到任何解决办法。 我曾尝试显式地将一个新的临时会话分配给PersistenceSet(在获取它时),但仍然没有成功(尽管会话工厂似乎在过滤器列表中有我的过滤器)

任何帮助都将不胜感激

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

  • OrderItem
    使用
    isRemoved
  • orderItems
    getter中,调用公共筛选方法,迭代项目并对其进行筛选。 缺点是,我必须从数据库中加载所有对象(已删除和未删除)
更新 由于sessionFactory SpringBean配置属性,我没有得到任何
LazyInitializationException

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

所以我猜:没有事务-没有会话-没有应用过滤器。

我认为最好将删除的行移动到新表中,比如foo_history。这就是Hibernate Envers所做的。@NeilMcGuigan谢谢,我来看看。事实上,我在我的项目中使用了Envers,也许这就足够了。
<prop key="hibernate.enable_lazy_load_no_trans">true</prop>