`
anson_xu
  • 浏览: 513005 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

Hibernate中多对多关系的常见问题

阅读更多

1、到底在哪用cascade="..."?
  
  cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所有cascade的关系就会被自己动的插入或是删除。便是为了能正确的cascade,unsaved-value是个很重要的属性。Hibernate通过这个属性来判断一个对象应该save还是update,如果这个对象的id是unsaved-value的话,那说明这个对象不是persistence object要save(insert);如果id是非unsaved-value的话,那说明这个对象是persistence object(数据库中已存在),只要update就行了。saveOrUpdate方法用的也是这个机制。
  
  2、到底在哪用inverse="ture"?  
  inverse属性默认是false的,就是说关系的两端都来维护关系。这个意思就是说,如有一个Student, Teacher和TeacherStudent表,Student和Teacher是多对多对多关系,这个关系由TeacherStudent这个表来表现。那么什么时候插入或删除TeacherStudent表中的记录来维护关系呢?在用hibernate时,我们不会显示的对TeacherStudent表做操作。对TeacherStudent的操作是hibernate帮我们做的。hibernate就是看hbm文件中指定的是"谁"维护关系,那个在插入或删除"谁"时,就会处发对关系表的操作。前提是"谁"这个对象已经知道这个关系了,就是说关系另一头的对象已经set或是add到"谁"这个对象里来了。前面说过inverse默认是false,就是关系的两端都维护关系,对其中任一个操作都会处发对表系表的操作。当在关系的一头,如Student中的bag或set中用了inverse="true"时,那就代表关系是由另一关维护的(Teacher)。就是说当这插入Student时,不会操作TeacherStudent表,即使Student已经知道了关系。只有当Teacher插入或删除时才会处发对关系表的操作。所以,当关系的两头都用inverse="true"是不对的,就会导致任何操作都不处发对关系表的操作。当两端都是inverse="false"或是default值是,在代码对关系显示的维护也是不对的,会导致在关系表中插入两次关系。
  
  在一对多关系中inverse就更有意义了。在多对多中,在哪端inverse="true"效果差不多(在效率上)。但是在一对多中,如果要一方维护关系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。而如果让"多"方面维护关系时就不会有update操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。当然这时也要遍历"多"方的每一个对象显示的操作修关系的变化体现到DB中。不管怎样说,还是让"多"方维护关系更直观一些。
  
  3、cascade和inverse有什么区别?
  
  可以这样理解,cascade定义的是关系两端对象到对象的级联关系;而inverse定义的是关系和对象的级联关系。
  
  4、net.sf.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): 2, of class: Xxxxx  
  这个问题出现在要删除关系的一头时。如,要删除一个已经和Student有关系的Teacher。当tx.commit();时才会抛出这个异常。这时一个在关系另一头的Student对象中的Set或是List中把这个Teacher对象显示的remove掉,再session.delete(这个teacher);。这是为了防止在Student端有cascade时把这个Teacher对象再存回DB。所以,这个异常的只有在Student的关系定义中有cascade="...",而且没有像上面说的显示的解除关系时才会出现。所以防止出现这个异常的方法就是:1,在Student端不用cascade;2,或是用cascade的话,就显示的删除对像中的关系。 3,在Teacher端要用cascade
  
  5、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时就会出现

分享到:
评论

相关推荐

    hibernate(多对多关系映射)

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系映射是一种常见的数据库交互模式,它用于表示两个实体之间复杂的关系。在这个场景中,一个实体可以与多个其他实体相关联,反之亦然。例如,在学生和课程...

    hibernate多对一单向关联关系实现源码

    在Java的持久化框架Hibernate中,多对一(ManyToOne)关联关系是一种常见的对象关系映射(ORM)场景。这种关系通常出现在一个实体类拥有多条与另一个实体类相关的记录,而另一个实体类可能只有一条对应的记录。例如...

    hibernate实现多对多关联关系源码

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关联关系是一种常见的实体间关系类型,它表示一个实体可以与多个其他实体相关联,反之亦然。本源码示例将深入探讨如何使用Hibernate来配置和管理这种复杂的...

    hibernate多对多

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,它允许一个实体实例对应多个其他实体实例,反之亦然。在本案例中,我们将深入探讨如何使用Hibernate来处理多对多的关系映射,...

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    hibernate多对一关联关系

    在Java的持久化框架Hibernate中,"多对一"关联关系是一种常见的对象关系映射(ORM)设计,它表示一个实体(子项)可以与多个其他实体(父项)相关联,而每个父项可能被多个子项引用。在数据库层面,这通常对应于一个...

    hibernate多对多查询

    本篇文章将聚焦于Hibernate中的多对多查询,这是一个复杂但常见的数据关联问题。 首先,我们需要理解关系数据库中的多对多关系。在现实生活中,很多关系都呈现出多对多的特性,例如学生与课程之间的关系,一个学生...

    hibernate 多对多源代码

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,它允许一个实体实例对应多个其他实体实例,反之亦然。本篇将深入探讨Hibernate如何处理这种复杂的数据关联。 一、多对多关系...

    Hibernate关于注解的一对多,多对多,一对一

    多对多关系常见于用户角色的例子,一个用户可以有多个角色,一个角色也可以被多个用户拥有。在Hibernate中,我们使用`@ManyToMany`注解来处理。 1. **@ManyToMany** 注解:在两个实体类中都需要使用此注解,分别...

    Hibernate多对多关联关系demo

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关联关系是一种常见的实体间关系类型,它表示一个实体可以与多个其他实体相关联,反之亦然。本示例"Hibernate多对多关联关系demo"将深入探讨如何在实际开发中...

    hibernate多对多关系

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,它表示两个实体类之间可以有多个对应的关系。例如,学生和课程就是一个典型的多对多关系,一个学生可以选修多个课程,而一个...

    hibernate关系映射多对多关系

    综上所述,这个压缩包提供了关于Hibernate关系映射的全面教程,包括多对多、一对一和一对多的关系配置,以及如何在Spring+Hibernate+Struts环境中应用这些关系。对于想要深入理解Hibernate并提升开发效率的Java...

    hibernate多对多关系项目

    本项目聚焦于Hibernate中的多对多关系映射,这是一种复杂但常见的数据库关联类型,适用于如用户角色、商品类别等场景。 **一、多对多关系** 在数据库设计中,多对多关系表示两个实体之间存在多个匹配的可能性。...

    hibernate一对多项目

    首先,一对多关系在数据库中很常见,例如一个用户可以有多个订单,一个班级可以有多名学生等。在Hibernate中,这种关系通过在实体类和映射文件中设置相应的注解或XML配置来实现。 1. **配置一对多关系**: - 在...

    Hibernate(多对多表操作)

    本主题将深入探讨如何在Hibernate中处理多对多的关系映射,这是数据库设计中常见的一种关系类型。 多对多关系在数据库中意味着一个表中的记录可以与另一个表中的多个记录相关联,反之亦然。例如,学生和课程的关系...

    hibernate多对多的简单实现

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,它允许一个实体实例对应多个其他实体实例,反之亦然。在本项目"hibernate多对多的简单实现"中,我们看到的是学生(Student)...

    Hibernate的多对一和一对多操作实例

    在数据库设计中,“多对一”(Many-to-One)和“一对多”(One-to-Many)是常见的关联类型,它们分别描述了两个实体之间的不同关系。在“多对一”关系中,多个实体的一个属性可以指向同一实体的单一实例;而在“一对...

    hibernate anotation 处理一对多关系

    在Product类中,`@ManyToOne`注解表示该实体与Category实体之间是多对一的关系。`@JoinColumn`注解用来指明外键字段在Product表中的位置和名称,`referencedColumnName`属性指明了外键所引用的父表(Category表)中...

    Hibernate多对多关系

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,它允许一个实体实例对应多个其他实体实例,反之亦然。这种关系在现实生活中很常见,例如,学生可以注册多门课程,课程也可以...

Global site tag (gtag.js) - Google Analytics