关于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修改过]