问题描述
- 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