未备案的网站 访问 hots,ui培训一般多少钱,专业的集团网站设计公司,ui培训课程前些天发现了一个巨牛的人工智能学习网站#xff0c;通俗易懂#xff0c;风趣幽默#xff0c;忍不住分享一下给大家。点击跳转到教程。
1. Hibernate中的1N问题描述 在多对一关系中#xff0c;当我们需要查询多的一方对应的表的记录时#xff0c;可以用一条sql语句就能…前些天发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家。点击跳转到教程。
1. Hibernate中的1N问题描述 在多对一关系中当我们需要查询多的一方对应的表的记录时可以用一条sql语句就能完成操作。然而在多的一方的实体类中的ManyToOne标注的fetch的默认值是fetchType.EAGER这时hibernate除了发出查询多的一方对应的表的记录的sql语句外还会发出n多方记录数条sql语句这就是1n问题。如bbs的板块Category主题topic回复msg。一个板块有多个主题而一个主题属于一个板块则Category和topic属于一对多的关系在topic里设置ManyToOne。当需要取出所有的主题时只需要发出select * from topic一条语句就能做到。然而hibernate会查询出每个topic所对应的Category所以会发出1n条sql语句。 2. 1N问题的解决办法 ①设置ManyToOne的fetch属性值为fetchType.LAZY这种方式解决后后面的n条sql语句按需而发。但是有个弊端就是如果需要级联查询就无法获取级联对象了。 ②设置BatchSize(size5)该注解要加在类上面跟Entity在同一位置这样发出的sql语句减少。这个设置在一定程度上提高了效率。 ③在hqp语句中使用用join fetch事实上Criteria用的就是这种方法。这也是最常用的方法
Test
//join fetch
publicvoid test1_N3(){ Session sessionsf.getCurrentSession(); session.beginTransaction(); //ListTopic topics(ListTopic)session.createCriteria(Topic.class).list();//只有一条查询语句Criteria方法就是这种方式 ListTopic topics(ListTopic)session.createQuery(from Topic t left join fetch t.category c).list(); for (Topic t:topics) { System.out.println(t.getId()----t.getTitle()); System.out.println(t.getCategory().getName()); } session.getTransaction().commit();
}
这就是Hibernate中的1N问题如有错误之处欢迎留言指正~