多对一-Hibernate上一个很诡异的问题

问题描述

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没有作用。这是为什么??

解决方案

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

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

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

时间: 2024-10-30 21:12:59

多对一-Hibernate上一个很诡异的问题的相关文章

html-麻烦帮忙看一个很诡异的CSS高度设置的问题

问题描述 麻烦帮忙看一个很诡异的CSS高度设置的问题 我有一个html文件,把一个div元素高度设置为45px,如果把文件直接拖到浏览器,这个div是正常的45px.但是如果是通过服务器访问,即localhost:8080/webroot/myhtml.html这样的形式访问,则这个div是46px,并且只会在谷歌出现这个问题更奇葩的是,只有最后一个数字是5的时候才出现问题,例如我设置为44px,53px是正常的,但是如果设置为45px,55px,65px就出问题了,下面是我的完整代码 <!DO

treeSet 一个很诡异的重复性判断问题

问题描述 有一个需求是这样的,要求去掉重复Id的文章,如果id相同就去掉,如果不同就按文章发表时间排序,但写完代码发现,id相同的文章怎么也去重不了:public class ArticleSource implements Comparable<ArticleSource> {private long id;private int sourceId;private long time;public ArticleSource(long id,int sourceId,long time) {

使用apache的BeanUtils,一个很诡异的问题

问题描述 public class MyBeanUtils extends org.apache.commons.beanutils.BeanUtils {public static void copyBeanNotNull2Bean(Object databean,Object tobean)throws Exception { PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(databea

丘成桐演讲全文:工程上取得很大发展,但理论基础仍非常薄弱,人工智能需要一个可被证明的理论作为基础

本文讲的是丘成桐演讲全文:工程上取得很大发展,但理论基础仍非常薄弱,人工智能需要一个可被证明的理论作为基础, 2017年10月26日上午,第十四届中国计算机大会(CNCC 2017)正式在福州海峡国际会展中心开幕,雷锋网作为独家战略合作媒体,对大会进行了全程报道. 在大会第一天,菲尔兹奖获得者.哈佛大学终身教授丘成桐在会上作为特邀嘉宾做了首个演讲报告,报告主题为<现代几何学在计算机科学中的应用>. 报告中丘成桐先生首先介绍了现代几何的发展历史,随后介绍了他与他的学生及朋友在计算机与几何交叉方面

hibernate-初学Hibernate遇到一个问题,疑惑很久了,请帮忙看看。

问题描述 初学Hibernate遇到一个问题,疑惑很久了,请帮忙看看. package com.pb.hibernate.test; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import com.pb.hibernate.po.Student; import com.pb.hibernate.util.HibernateS

请教一个很简单的问题,如何在ASP.net页面上显示一个变量

问题描述 请教一个很简单的问题,如何在ASP.net页面上显示一个变量,比如登陆的时候,在固定位置显示***你好.如果不用response.write还有没有别的办法啊 解决方案 解决方案二:可以在你想放变量的地方放一个LABEL..赋值后显示就OK了解决方案三:好的,谢谢啦解决方案四:方法很多,常见的如楼上

hibernate 多对一得跑起来很慢,大家如何解决?

问题描述 hibernate多对一得跑起来很慢,大家如何解决? 解决方案 解决方案二:看你是不是需要及时获得信息.如果要的话fetch='join'看你用不用延迟加载了!!如果用lazy='true',那配fetch='join'作用也不大,就要用select其次就怕关联了spring,这个有优化sql功能.慢慢研究.解决方案三:我比较好奇,楼主是怎么感觉到他慢的?解决方案四:详细点楼主没说清楚尽量懒加载解决方案五:延迟加载,还有就是别用关系

从一个很简单的文件上传来品味面向对象的大局观(抽象类和功能类)

/// <summary>     /// 文件上传的模块     /// </summary>     public enum FileModelType     {         /// <summary>         /// 头像         /// </summary>         User,         /// <summary>         /// 产品图像         /// </summary>

产品外形上、功能上,描绘一个很炫很酷的外形

在传统产品加上"智能"的标签后,总会想着法子标新立异,在产品外形上.功能上,描绘一个很炫很酷的外形.但其中也有"憨厚"的角色,比如康康血压仪的产品. 康康血压仪的创始人是80后女孩李菁,离职创业之前是IBM的产品架构师.她做血压仪的出发点也是从自己家人的需求考虑--她需要远程知晓患有高血压的母亲身体状况. 她的产品逻辑是这样的: 1.和传统家用式血压仪差不多的血压计,但有一个不同是,血压数据可以通过蓝牙或WiFi直连的方法传送到手机上. 2.多次测量(每天一次)数据