我是帕小帕 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 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题