Java 如何在hibernate中检查一个对象是否连接到另一个对象
想象两个域对象类,Java 如何在hibernate中检查一个对象是否连接到另一个对象,java,hibernate,Java,Hibernate,想象两个域对象类,A和BA与B具有双向一对多关系A与数千个B相关。关系必须是唯一的,不可能有重复的 为了检查B的实例是否已经连接到a的给定实例,我们可以执行一个简单的内部连接,但这只能确保已经存在的关系 那么当前的瞬态关系呢 class A { @OneToMany private List<B> listOfB; } A类{ @独身癖 私人名单b; } 如果我们访问listOfB并检查contains(),这将从数据源获取Blazy的所有连接实例。我只想通过它们的主
A
和B
A
与B
具有双向一对多关系A
与数千个B
相关。关系必须是唯一的,不可能有重复的
为了检查B
的实例是否已经连接到a
的给定实例,我们可以执行一个简单的内部连接
,但这只能确保已经存在的关系
那么当前的瞬态关系呢
class A {
@OneToMany
private List<B> listOfB;
}
A类{
@独身癖
私人名单b;
}
如果我们访问listOfB
并检查contains()
,这将从数据源获取B
lazy的所有连接实例。我只想通过它们的主键来验证它们
是否有一个简单的解决方案,我可以在不将所有这些数据加载到内存并基于集合执行查找的情况下执行类似“此
A
实例是否与此B
实例相连接?” 再想一想你问题的最后一段,既然关联是双向的,我会在你的特定实例B上搜索一个与a关联的实例。为什么你不能执行内部连接
在默认刷新模式下,Hibernate将在执行查询之前刷新会话,因此集合中未保存的元素不成问题。我认为可以分两步完成。对于瞬态B,
加上你的过渡期
列表B中的B也会添加到瞬态
也请列出。并在列表中进行包含检查
对于持久化的B,使用如下查询:
select count(*) from B b where b.a.id = :aId
如果这
查询返回零,可以说不存在关系
在A和B之间。谢谢你的回答。特别懒散的收藏帮了我的忙。我用LazyCollection
注释配置了@OneToMany
连接
@IndexColumn(name = "index", base = 1)
@LazyCollection(LazyCollectionOption.EXTRA)
这篇文章帮助我做到了这一点。使用此选项时,#size()
,#contains()
,#get()
,等等。不要触发集合初始化。它肯定会加载所有对象,这就是问题所在,我们遇到了性能问题。Hibernate创建并初始化所有这些对象。