我是帕小帕 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函数吗?

    评论

报告相同问题?

悬赏问题

  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常