Hibernate检索父/子

时间:2016-03-14 00:28:29

标签: java hibernate

因此,当我有一对多的双向关系时,我该如何确保根据需要从数据库中获取它们?

例如:

在父类中:

@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是否真的在创建时与父母/子女填充对象,如果是这样,我不确定检索它们的最有效方法。

2 个答案:

答案 0 :(得分:3)

关系的每一面都可以配置为渴望或懒惰。如果它很渴望,Hibernate将在加载包含对象时立即加载对象。如果它是惰性的,Hibernate将放置一个占位符代理对象,并且该代理对象将在您第一次访问它时自动加载实际代理对象(假设会话/事务仍处于打开状态,否则它会抛出LazyInitializationException )。无论哪种方式,访问关系的语法都是相同的 - p.getChildren()child.getParent()将在两种情况下都有效。

哪种选项最有效取决于您个人用例的详细信息。特别是,您需要多长时间来关联加载包含对象的频率(懒惰允许您跳过不必要的加载),可能是多个关系引用单个对象的频率(取决于实现,渴望检查数据库表)即使对象已经加载并且在内存中),以及在关闭会话后是否需要访问关系。

答案 1 :(得分:0)

All things depend upon your configuration.If you will apply lazy loading then hibernate internally fetch the record from query at the time of getting the record except its identity.
You can see the 
Fetching Strategies
There are four fetching strategies

1. fetch-“join” = Disable the lazy loading, always load all the collections and entities.
2. fetch-“select” (default) = Lazy load all the collections and entities.
3. batch-size=”N” = Fetching up to ‘N’ collections or entities, *Not record*.
4. fetch-“subselect” = Group its collection into a sub select statement.


If you want to surety that what is happening internally in hibernate then Please enable
<!--hibernate.cfg.xml -->
<property name="show_sql">true</property>

after enable you can see all queries in console.