关于hibernate和面向对象设计的问题。

09-04-21 xmuzyu

我先来说一下,我具体项目中遇到的一个问题,场景如下:
public class Account{

private String id ;
......
//setter,getter

@ManyToMany(fetchType=LAZY)
private List<Account> friends ;

public void addFriend(Account friend){
this.getFriends().add(friend);
friend.getFriends().add(this);
}


}

现在问题出现了,当要实现加好友的功能时,我们必须这样:
Account zhangsan= session.get(Account.class,zhangsanId);
Account lisi = session.get(Account.class,lisiId);
zhangsan.addFriend(friend);

这样写的话,造成严重的性能问题,因为首先hibernate要用两条sql语句去装载zhangsan和lisi,然后在调用
account.addFriend(friend)的时候,hibernate还会生成两条sql语句去加载zhangsan的好友以及lisi的好友,这么一个简单的功能,如果想按照OO点的方式实现,那么就需要四条sql语句。代价过高。
而如果我们直接来操作连接表的话,此时只需要insert into user_friend(zhangsanId,lisiId);
insert into user_friend(lisiId,zhangsanId);

并且如果在极端一点,用jdbc实现的话,加好友,只需要加insert 一条数据到关联表就OK了。
但是这样以来,逻辑完全脱离了model,我们必须在service里来实现。所以OO和hibernate也存在一定得阻隔。

最后,当然是想请问一下,各位道友,你们在日常开发当中,比如这种问题,是怎么取得平衡的呢?

[该贴被xmuzyu于2009-04-21 23:35修改过]