配置set的时候,inverse="true"一般要写在某一边吗?如果 Book 和 Author 多对多,写在 Author 这边的话: Book book1 = new Book();
book1.setId(1L);
book1.setName("Hibernate In Action");
book1.setPrice(54.30F);
book1.setPublishDate(new Date());
book1.setRe("Manning In Action Sections");

Book book2 = new Book();
book2.setId(2L);
book2.setName("jQuery实战");
book2.setPrice(25.90F);
book2.setPublishDate(new Date());
book2.setRe("Manning In Action Sections");

Author author1 = new Author();
author1.setId(1L);
author1.setName("zhangsan");

Author author2 = new Author();
author2.setId(2L);
author2.setName("lisi");

Set<Author> authors = new HashSet<Author>();
authors.add(author1);
authors.add(author2);
book1.setAuthors(authors);

Set<Book> books = new HashSet<Book>();
books.add(book1);
books.add(book2);
author1.setBooks(books);

session.save(book1);
这样存了之后,取 author1 的话不会有 book2 相关的信息。
Author au = (Author)session.load(Author.class, new Long(1L));
如果两边都不写inverse="true",数据库的数据就会重复。应该怎么弄?

解决方案 »

  1.   

    “set的inverse属性决定是否把对set的改动反映到数据库中去。inverse=false————反映;inverse=true————不反映”inverse属性默认为false 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中。不管怎样说,还是让"多"方维护关系更直观一些。 (1)对one-to-many而言,改变set,会让hibernate执行一系列的update语句, 不会delete/insert数据 (2)对many-to-many而言,改变set,只修改关系表的数据,不会影响many-to-many的另一方。 (3)虽然one-to-many和many-to-many的数据库操作不一样,但目的都是一个:维护数据的一致性。 
      

  2.   

    随便你设置哪一头,不过两边设置Lazy="true" 这样你取的时候就会把对方的信息取出来了!
      

  3.   

    "这样存了之后,取 author1 的话不会有 book2 相关的信息。"