我没仔细看,但是从你测试方法看的话,有点问题,如果在hibernate中把2个类关联了的话,那重要配置好关联,保存只要调用一个的save就可以,没有必要去调用2次的。
具体的关联保存,可以去google一下,能找到范例的

解决方案 »

  1.   

    贴配置文件出来吧   应该是你没有配置级联更新 需要设置cascade属性
    更新一个类a对象 然后把另一类b的对象都塞入a的set集合中, 更新a  
    hibernate根据map配置文件解析成sql  执行 插入数据
      

  2.   

    试一下改成以下:
    测试: /*菜单加菜单项*/  
    public void testMenuAddItem()  
    {  
    Session sn = HibernateUtil.getSession();  
    Transaction tx = sn.beginTransaction();  Menu menu = new Menu();  
    menu.setName("文件");  
    MenuItem menuItem = new MenuItem();  
    menuItem.setName("打开");  
    menu.getMenuItems().add(menuItem);  
    menuItem.getMenus().add(menu);  
    sn.save(menu);  
    tx.commit();
    Transaction tx = sn.beginTransaction();  
    sn.clear();       
    sn.save(menuItem);  
    tx.commit();  
    sn.close();  }  
      

  3.   

    其它地方不改,只要把Menu或是MenuItem中的集事项的inverse改为false,
    对于inverse 的作用可以查一下资料!
      

  4.   

    5楼正解,inverse一个TRUE 一个FALSE,全TRUE就不插入,全FALSE就插入2次
      

  5.   

    我也遇到过,但是像5楼那样还是不行
    Role 类
    private Set<Menu> menus;
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    @ManyToMany(mappedBy="roles",fetch = FetchType.EAGER)
    @Sort
    public Set<Menu> getMenus() {
    return menus;
    }menu 类
    @ManyToMany
    @JoinTable(name="tunshi_bi_menus_roles",
    joinColumns={@JoinColumn(name="menu_id")},
    inverseJoinColumns={@JoinColumn(name="role_id")})
    @Cascade({org.hibernate.annotations.CascadeType.ALL})不知道哪错