Hibernate常见问题.doc_第1页
Hibernate常见问题.doc_第2页
Hibernate常见问题.doc_第3页
Hibernate常见问题.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hibernate常见问题、到底在哪用cascade=.?cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所有 cascade的关系就会被自己动的插入或是删除。便是为了能正确的cascade,unsaved-value是个很重要的属性。Hibernate通 过这个属性来判断一个对象应该save还是update,如果这个对象的id是unsaved-value的话,那说明这个对象不是 persistence object要save(insert);如果id是非unsaved-value的话,那说明这个对象是persistence object(数据库中已存在),只要update就行了。saveOrUpdate方法用的也是这个机制。、到底在哪用inverse=ture?inverse属性默认是false的,就是说关系的两端都来维护关系。这个意思就是说,如有一个Student, Teacher和TeacherStudent表,Student和Teacher是多对多对多关系,这个关系由TeacherStudent这个表来表 现。那么什么时候插入或删除TeacherStudent表中的记录来维护关系呢?在用hibernate时,我们不会显示的对 TeacherStudent表做操作。对TeacherStudent的操作是hibernate帮我们做的。hibernate就是看hbm文件中指 定的是谁维护关系,那个在插入或删除谁时,就会处发对关系表的操作。前提是谁这个对象已经知道这个关系了,就是说关系另一头的对象已经set 或是add到谁这个对象里来了。前面说过inverse默认是false,就是关系的两端都维护关系,对其中任一个操作都会处发对表系表的操作。当在 关系的一头,如Student中的bag或set中用了inversetrue时,那就代表关系是由另一关维护的(Teacher)。就是说当这插 入Student时,不会操作TeacherStudent表,即使Student已经?懒斯叵怠挥械盩eacher插入或删除时才会处发对关系表的 操作。所以,当关系的两头都用inverse=true是不对的,就会导致任何操作都不处发对关系表的操作。当两端都是 inverse=false或是default值是,在代码对关系显示的维护也是不对的,会导致在关系表中插入两次关系。在一对多关系中inverse就更有意义了。在多对多中,在哪端inverse=true效果差不多(在效率上)。但是在一对多中,如果要一方维 护关系,就会使在插入或是删除一方时去update多方的每一个与这个一的对象有关系的对象。而如果让多方面维护关系时就不会有 update操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。当然这时也要遍历多方的每一个对象显示的操作修关系的变化体现到 DB中。不管怎样说,还是让多方维护关系更直观一些。、cascade和inverse有什么区别?可以这样理解,cascade定义的是关系两端对象到对象的级联关系;而inverse定义的是关系和对象的级联关系。、net.sf.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): 2, of class: Xxxxx这个问题出现在要删除关系的一头时。如,要删除一个已经和Student有关系的Teacher。当mit();时才会抛出这个异常。这 时一个在关系另一头的Student对象中的Set或是List中把这个Teacher对象显示的remove掉,再session.delete(这个 teacher);。这是为了防止在Student端有cascade时把这个Teacher对象再存回DB。所以,这个异常的只有在Student的关 系定义中有cascade=.,而且没有像上面说的显示的解除关系时才会出现。所以防止出现这个异常的方法就是:1,在Student端不用 cascade;2,或是用cascade的话,就显示的删除对像中的关系。 3,在Teacher端要用cascade、net.sf.hibernate.HibernateException: identifier of an instance of my.MyObject altered from N to N这个异常其时不是多对多中常遇到的,但是这个异常的提示不make sense,所以提一下,是因为id的java对象中的type和hbm文件中定义的不一样,如:java中用long,而hbm中用 type=integer,并且generator用的是identity时就会出现6、(To be add) 把hibernate遇到常见异常会一点点加上来的您可以使用Criteria进行查询,并使用Order对结果进行排序,例如使用Oder.asc()由小到大排序(反之则使用desc()): Criteria criteria = session.createCriteria(User.class); criteria.addOrder(Order.asc(age); List users = criteria.list(); setMaxResults()方法可以限定查询回来的笔数,如果配合setFirstResult()设定传回查询结果第一笔资料的位置,就可以实现简单的分页,例如传回第51笔之后的50笔资料(如果有的话): Criteria criteria = session.createCriteria(User.class); criteria.setFirstResult(51); criteria.setMaxResult(50); List users = criteria.list(); 您可以对查询结果进行统计动作,使用Projections的avg()、rowCount()、count()、max()、min()、 countDistinct()等方法,例如对查询结果的age作平均: Criteria criteria = session.createCriteria(User.class); criteria.setProjection(Projections.avg(age); List users = criteria.list(); Iterator iterator =users.iterator(); while(iterator.hasNext() System.out.println(iterator.next(); 还可以配合Projections的groupProperty()来对结果进行分组,例如以age进行分组,也就是如果资料中age如果有 20、20、25、30,则以下会显示20、25、30: Criteria criteria = session.createCriteria(User.class); criteria.setProjection(Projections.groupProperty(age); List users = criteria.list(); Iterator iterator =users.iterator(); while(iterator.hasNext() System.out.println(iterator.next(); 如果想结合统计与分组功能,则可以使用ProjectionList,例如下面的程式会计算每个年龄各有多少个人: ProjectionList projectionList = PjectionList(); projectionList.add(Projections.groupProperty(age); projectionList.add(Projections.rowCount(); Criteria criteria = session.createCriteria(User.class); criteria.setProjection(projectionList); List users = criteria.list(); Iterator iterator =users.iterator(); while(iterator.hasNext() Object o = (Object) iterator.next(); System.out.println(o0 + t + o1); 如果有一个已知的物件,则可以根据这个物件作为查询的依据,看看是否有属性与之类似的物件,例如: User user = new User(); user.setAge(new Integer(30); Criteria criteria = session.createCriteria(User.class); criteria.add(Example.create(user); List users = criteria.list(); Iterator iterator =users.iterator(); System.out.println(id t name/age); while(iterator.hasNext() User ur = (User) iterator.next(); System.out.println(ur.getId() + t + ur.getName() + / + ur.getAge(); 在这个例子中,user物件中有已知的属性age为30,使用Example会自动过滤掉user的空属性,并以之作为查询的依据,也就是找出 age同为30的资料。 Criteria可以进行复合查询,即在原有的查询基础上再进行查询,例如在Room对User的一对多关联中,在查询出所有的Room资料之后,希望再查询users中age为30的user资料: Criteria roomCriteria = session.createCriteria(Room

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论