我是帕小帕 2014-04-03 08:19 采纳率: 0%
浏览 1868

Hibernate上一个很诡异的问题

User.hbm.xml:

<set cascade="all" inverse="true" name="activeFriends" sort="unsorted">
   <key column="concernedUserId"/>
   <one-to-many class="Friends"/>
</set>
<set cascade="all" inverse="true" name="passiveFriends" sort="unsorted">
   <key column="userId"/>
   <one-to-many class="Friends"/>
</set>`

Friends.hbm.xml:

  <composite-id>
<key-many-to-one name="activeUser" column="userId" class="User"></key-many-to-one>
<key-many-to-one name="passiveUser" column="concernedUserId" class="User"></key-many-to-one>
</composite-id>

DaoImpl:

/**
 * 添加用户关注
 */
public void userAddConcern(int userId,int concernedUserId) {
    Session session=null;
    User activeUser=null;
    User passiveUser=null;
    try{
        session = HibernateUtil.getSession();
        session.getTransaction().begin();
        activeUser=(User)session.createQuery("from User user where user.id=:id").setInteger("id",userId).uniqueResult();
        passiveUser=(User)session.createQuery("from User user where user.id=:id").setInteger("id",concernedUserId).uniqueResult();
        if(activeUser==null||passiveUser==null)
        {
            return;
        }
        Friends friend=new Friends();
        friend.setActiveUser(activeUser);
        friend.setPassiveUser(passiveUser);
        activeUser.getPassiveFriends().add(friend);
        session.getTransaction().commit();
    }catch(Exception e){
        e.printStackTrace();
        session.getTransaction().rollback();
    }finally{
        session.close();
    }
}

/**
 * 取消用户关注
 */
public void userRemoveConcern(int userId, int concernedUserId) {
    Session session=null;
    User activeUser=null;
    User passiveUser=null;
    try{
        session = HibernateUtil.getSession();
        session.getTransaction().begin();
        activeUser=(User)session.createQuery("from User user where user.id=:id").setInteger("id",userId).uniqueResult();
        passiveUser=(User)session.createQuery("from User user where user.id=:id").setInteger("id",concernedUserId).uniqueResult();
        if(activeUser==null||passiveUser==null)
        {
            return;
        }
        Friends friend=new Friends();
        friend.setActiveUser(activeUser);
        friend.setPassiveUser(passiveUser);
        activeUser.getPassiveFriends().remove(friend);
        session.getTransaction().commit();
    }catch(Exception e){
        e.printStackTrace();
        session.getTransaction().rollback();
    }finally{
        session.close();
    }
}

这两个函数功能大致是模仿微博上用户关注的功能
问题是第一个函数功能正常,第二个函数没反应。
第二个函数主要功能是取消关注,对象activeUser打印后,确实在passiveFriend集合里面将那个关注的关系删掉了,但是commit没有作用。这是为什么??

  • 写回答

1条回答 默认 最新

  • dison_ 2014-04-03 09:05
    关注

    关键就在于这个Friends friend=new Friends();

    你虽然想remove掉这个实体,但是数据库中无法找到,进而删除不了!你应该给这个实体set一个主键 (我个人这么想)

    能让我看下getPassiveFriends() 里面的remove函数吗?

    评论

报告相同问题?

悬赏问题

  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教