hibernate中两张表是多对多的关系,如何通过a表查询b表的信息呢?麻烦大家详细点解答,谢谢了,小弟100分全部送上啦

解决方案 »

  1.   

    建议试在持久化类中设置Set包含多的对象的字段,在ORM中配置<set>试试,看是否可行,实在没见过数据库设计直接用多对多关系来做的
      

  2.   

    由于多对多关联的性能不佳(由于引入了中间表,一次读取操作需要反复数次查询),因此在设计中应该避免大量使用或者说避免使用.同时,在多对多关系中,应根据情况,采取延迟加载(Lazy loading)机制来避免无谓的性能开销.
      

  3.   

      怎么写。你在网上搜一个hibernate 多对多,有很例子。
      但我想说的是,一点常见的错误 
      有一个session is close 。
      这个是因为,在极联操作的时候,第一次select 完的时候它把session关了。 
      这时候,你可以设置layz=false;这种方式问题可以解决,但 是不太好的,
      假如你是web的程序,你可以用一个filter
      也可以用这种式Hibernate.initialize
      还有一个session不同步。
      等等。。 东西,还是很多的,N人和菜鸟,在效率上有很大的区别,可控性不太好。
      本人 是菜鸟
      

  4.   

    关联是否已经建立,基于注释的关联给你个简单例子
    这是用户表和角色表的多对多关联,用户表(Users)---用户角色关联表(UserRoles)--角色表(Roles)
    import java.io.Serializable;
    import java.util.Collection;
    import javax.persistence.*;@Entity
    @Table(name = "Users")
    public class User implements Serializable {
        @Id
        @Column(name = "id", nullable = false)
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;
        @Column(name = "name")
        private String name;
        @JoinTable(name = "UserRoles", joinColumns = {@JoinColumn(name = "userId", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "roleId", referencedColumnName = "id")})
        @ManyToMany(cascade = CascadeType.ALL)
        private Collection<Role> roleIdCollection;
        //get/set方法
    }package com.lan.baseproject.entity;
    import java.io.Serializable;
    import java.util.Collection;
    import javax.persistence.*;@Entity
    @Table(name = "Roles")
    public class Role implements Serializable {
        @Id
        @Column(name = "id", nullable = false)
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;
        @Column(name = "name")
        private String name;
        @ManyToMany(mappedBy = "roleIdCollection")
        private Collection<User> userIdCollection;   
        //get/set方法
    }如果通过一方获取另一方的信息很简单,比如知道了User类
    那只需要
    Collection<Role> roles= user.getRoleIdCollection();//注意延迟加载的细节问题
    具体的请参见hibernate的anotation文档,或者hibernate实战
      

  5.   


    opensessioninview  就搞定了,虽然效率上存在问题,但还是被极力赞扬的
      

  6.   

    找到映射文件中<set>标签加上lazy="false"就行了,
    听说效率不好,不过确实很简单就查出来了
      

  7.   

    在Session没有关闭前调用collection.size(),这样就会触发加载机制。或者你把Transaction前置到Controller层