使用orcale数据库hibernate能用多对多关系吗??如果能用那么中间表的Id怎么办!?怎么让它自增?

解决方案 »

  1.   

    当然能啊,跟id没什么关系的,是object对object多对多啊,,,
      

  2.   

    谁有案例,发给我看看,[email protected]
      

  3.   

    比如我有一个role表,有一个right表,有一个中间表role-right
    我在项目中创建实体类,形成role,right类还有它们的映射,在映射中配置它们的ID为自增,
    添加的时候,中间表没有插入成功,缺少中间表的ID,因为Oracle的Id不是没有自增吗,怎么办??
      

  4.   

        你可以创建序列   让ID自增!  看看资料就OK了   
      

  5.   

    ★多对多关联映射_单向(用户→角色)
    ★多对多关联映射_双向(用户<-->角色)1.多对多关联映射_单向(用户→角色)
    多对多关联映射,需要一张中间表建立关系才可以体现出多对多关系
    ---
    举例说明:
    ①新建User.java和Role.java
    User.java代码如下:
    public class User {
    private int id;
    private String name;
    //体现用户可以有多个角色
    private Set roles;public Set getRoles() {
    return roles;
    }
    public void setRoles(Set roles) {
    this.roles = roles;
    }
    public int getId() {
    return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }  
    }
    Role.java代码如下:
    public class Role {
    private int id;
    private String name;public int getId() {
    return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    }
    ---
    ②新建Role.hbm.xml和User.hbm.xml
    Role.hbm.xml代码如下:
    <hibernate-mapping>
     <class name="com.lxl.bean.Role" table="t_role">
      <id name="id">
       <generator class="native">
       </generator>
      </id>
      <property name="name"></property>
     </class>
    </hibernate-mapping>
    User.hbm.xml代码如下:
    <hibernate-mapping>
     <class name="com.lxl.bean.User" table="t_user">
      <id name="id">
       <generator class="native"></generator>
      </id>
      <property name="name"></property>
      <!-- table="t_user_role"
            多对多关系中,中间表的名称
           hibernate会自动生成
       -->
      <set name="roles" table="t_user_role">
       <!-- column="userid"
             将t_user表的主键在中间表
             生成一个叫userid的字段
        -->
       <key column="userid"></key>
       <!-- 体现多对多关系 -->
       <many-to-many class="com.lxl.bean.Role" column="roleid"></many-to-many>
      </set>
     </class>
    </hibernate-mapping>
    ---
    ③在hibernate.cfg.xml中将Role.hbm.xml和User.hbm.xml配置
    ...
    <mapping resource="com/lxl/bean/User.hbm.xml"/>
    <mapping resource="com/lxl/bean/Role.hbm.xml"/>
    </session-factory>
    ---
    ④利用ExportDB.java建表以及创建工厂的HibernateUtils.java
    拷贝过来
    ---
    ⑤新建测试类ManytomanyTest,继承于TestCase
    //方法testManytomany()保存数据
    public void testManytomany(){
    Session session = null;
    Transaction tx = null;
    try {
    session = HibernateUtils.getSession();
        tx = session.beginTransaction();
        
        //角色:发布人员
        Role role1 = new Role();
        role1.setName("发布人员");
        session.save(role1);
        
        //角色:审核人员
        Role role2 = new Role();
        role2.setName("审核人员");
        session.save(role2);
        
        //用户:lxl
        //角色:发布人员,审核人员
        User user1 = new User();
        user1.setName("lxl");
        Set userset1 = new HashSet();
        userset1.add(role1);
        userset1.add(role2);
        user1.setRoles(userset1);
        session.save(user1);
        
        //用户:pw
        //角色:发布人员
        User user2 = new User();
        user2.setName("pw");
        Set userset2 = new HashSet();
        userset2.add(role1);
        user2.setRoles(userset2);
        session.save(user2);
        
    tx.commit();
    } catch (Exception e) {
    e.printStackTrace();
    tx.rollback();
    }finally{
    HibernateUtils.closeSession(session);
    }
    }
    //测试加载(因为是单向的,所以只能由user→role)
    public void testManytomany2(){
    Session session = null;
    Transaction tx = null;
    try {
    session = HibernateUtils.getSession();
        tx = session.beginTransaction();
        
        User user = (User) session.load(User.class, 3);
        System.out.println("用户名:"+user.getName());
        for(Iterator iterator = user.getRoles().iterator();iterator.hasNext();){
         Role role = (Role) iterator.next();
         System.out.println("对应的角色:"+role.getName());
        }

    tx.commit();
    } catch (Exception e) {
    e.printStackTrace();
    tx.rollback();
    }finally{
    HibernateUtils.closeSession(session);
    }
    }2.多对多关联映射_双向(用户<-->角色)
    需要修改Role.java和Role.hbm.xml的代码,
    Role.java需要修改的代码如下:
    public class Role {
    private int id;
    private String name;
    //体现角色可以有多个用户
    private Set users;public Set getUsers() {
    return users;
    }
    public void setUsers(Set users) {
    this.users = users;
    }
    public int getId() {
    return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    }
    Role.hbm.xml需要修改的代码如下:
    <hibernate-mapping>
     <class name="com.lxl.bean.Role" table="t_role">
      <id name="id">
       <generator class="native">
       </generator>
      </id>
      <property name="name"></property>
      <set name="users" table="t_user_role">
       <key column="roleid"></key>
       <many-to-many class="com.lxl.bean.User" column="userid"></many-to-many>
      </set>
     </class>
    </hibernate-mapping>
    -----
    因为双向的保存数据与单向相同,我们就不演示了
    显示一下加载
    //测试加载(双向)
    public void testManytomany3(){
    Session session = null;
    Transaction tx = null;
    try {
    session = HibernateUtils.getSession();
        tx = session.beginTransaction();
        
        Role role = (Role) session.load(Role.class, 1);
        System.out.println("角色名:"+role.getName());
        for(Iterator iterator = role.getUsers().iterator();iterator.hasNext();){
         User user = (User) iterator.next();
         System.out.println("对应的用户:"+user.getName());
        }

    tx.commit();
    } catch (Exception e) {
    e.printStackTrace();
    tx.rollback();
    }finally{
    HibernateUtils.closeSession(session);
    }
    }
    在控制台我们可以看到:
    角色名:发布人员
    对应的用户:pw
    对应的用户:lxl
    也许有的人发现了,用户的显示顺序并不是按照我们保存用户时的顺序显示的
    那么,怎么办?
    hibernate提供了一个属性:order-by
    ...
    <set name="users" table="t_user_role" order-by="userid">
    ...
    order-by="userid"表示按照用户的主键排序,再次运行testManytomany3()
    你可以在控制台看到:
    角色名:发布人员
    对应的用户:lxl
    对应的用户:pw
      

  6.   

    hibernate是通用数据库的  什么数据库都可以
      

  7.   

    8楼的兄弟,我项目里刚开始用的是sql server2005数据库,使用多对多没有问题,后来改成了oracle,,但是在执行插入的时候报错,说找不到中间表的ID,因为oracle的ID列不是不能自增吗,我也建了序列,但是还是不行??我把中间表的主键ID删了,就没事了,郁闷!!!!,大家是怎么做的啊,我刚刚使用oracle,不是太会用!!