我是帕小帕 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 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序