因此,当我具有一对多的双向关系时,如何确保根据需要从数据库中获取它们?
例如:
在家长班:
@OneToMany(mappedBy="parent")
List<Child> children;
在儿童班:
@ManyToOne
@JoinColumn(name="Parent_Id")
Parent parent;
我只是不确定如何确保当我有父母时,我可以得到它的孩子的清单,反之亦然。不确定Hibernate是如何处理的。
如果要生孩子,我的第一个直觉将是:
String hql="FROM Parent WHERE id=:id";
Query query = session.createQuery(hql);
query.setInteger("id", id);
Parent p = (Parent)query.uniqueResult();
List<Child>=p.getChildren();
与此相反:
//insert retrieve child code
Parent p = child.getParent();
我的困惑是,我不确定Hibernate在创建时是否真的在与父母/孩子一起填充对象,如果这样,我不确定是否最有效的方法来检索它们。
关系的每一边都可以配置为渴望或懒惰。如果渴望的话,Hibernate将在加载包含对象的对象后立即加载该对象。如果它是惰性的,则Hibernate将放入一个占位符代理对象,并且该代理对象将在您第一次访问它时自动加载真实对象(前提是会话/事务仍处于打开状态,否则将抛出LazyInitializationException
)。无论哪种方式,访问关系的语法都是相同的-p.getChildren()
或child.getParent()
在两种情况下均适用。
哪个选项最有效取决于您的个别用例的细节。特别是,相对于加载包含对象的频率,您需要多久一次的关系(惰性使您跳过不必要的负载),多个关系可能会引用一个对象的频率(取决于实现,急切地可能会检查数据库表) (即使对象已经加载并在内存中),以及在关闭会话后是否需要访问该关系。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句