该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-09-23
User user=getUser(uid);
Hero hero=getHero(hid); 为什么不 Hero hero = getHero(hid); User user = hero.getUser(); a(hero); 里外用法不一致? |
|
返回顶楼 | |
发表时间:2011-09-23
最后修改:2011-09-23
抛出异常的爱 写道 User user=getUser(uid);
Hero hero=getHero(hid); 为什么不 Hero hero = getHero(hid); User user = hero.getUser(); a(hero); 里外用法不一致? 注意这点的人当然好,举一个例子。 有一个计算方法:会对这个List<Hero> heros; 进行一些计算 并且操作User 在方法外面也有一些操作User的代码。 如果单一的操作 是按照你写的方式去做。 Hero hero1=get(hero); Hero hero2=get(hero); 遇到一个List<Hero> 你会User user=get(0).getUser(); 然后去做么。当然hibernate这里有一级缓存但仅限于同一个session生命值周期内。。 这个是其中的一个陷阱。 还有另外一个陷阱: User user=get(User); user.setLevel(user.getLevel+1); update(user); 与 update User set level = level +1;的区别。 在不同事物中操作同一条记录的时候,问题就显现出来了。当然,hibernate对于这个问题可以用加锁的方式解决。 |
|
返回顶楼 | |
发表时间:2011-09-23
这玩意儿不就是Component吗?
|
|
返回顶楼 | |
发表时间:2011-09-23
我觉得不是hibernate冗余了,是你的代码冗余了
在同一个事务里面对同一个对象进行矛盾的修改,前面的一些修改根本就是在做无用功,你说这样的情况会碰到很多,只能说明你们的设计不是足够良好的 |
|
返回顶楼 | |
发表时间:2011-09-23
最后修改:2011-09-23
matlab5y5 写道 我觉得不是hibernate冗余了,是你的代码冗余了
在同一个事务里面对同一个对象进行矛盾的修改,前面的一些修改根本就是在做无用功,你说这样的情况会碰到很多,只能说明你们的设计不是足够良好的 这种设计是很普遍的设计。1对多关联,除非你得hero 和user “毫无关联”。而且这些并不是同一对象。这里只是举例。虽然都是同一个userId但是User对象却可能不同! |
|
返回顶楼 | |
发表时间:2011-09-23
最后修改:2011-09-23
糟糕的设计,就像是LZ举的失败的例子
|
|
返回顶楼 | |
发表时间:2011-09-23
aa87963014 写道 matlab5y5 写道 我觉得不是hibernate冗余了,是你的代码冗余了
在同一个事务里面对同一个对象进行矛盾的修改,前面的一些修改根本就是在做无用功,你说这样的情况会碰到很多,只能说明你们的设计不是足够良好的 这种设计是很普遍的设计。1对多关联,除非你得hero 和user “毫无关联”。而且这些并不是同一对象。这里只是举例。虽然都是同一个userId但是User对象却可能不同! 弱弱的说..除了及其特殊.比如登陆等情况.大多数时候不设关系的... |
|
返回顶楼 | |
发表时间:2011-09-23
居然还在纠结设计。随便举一个例子
User保存活跃分,Hero计算战斗之后更改活跃分。User Hero 一对多。求高人给个不失败的设计 |
|
返回顶楼 | |
发表时间:2011-09-23
最后修改:2011-09-23
对于a,b函数,从函数的简单性与可测性而言,以及从两个函数的逻辑而言,看不任何出嵌套调用的原因。
|
|
返回顶楼 | |
发表时间:2011-09-23
我不知道我是不是理解错了,Hibernate有单向和双向,你从Hero端处理数据,取得对象用load,casecade使用Merge.
至于你最终想更新的User中的分数,处理方式完全可以将分数下移到各个Hero,如果要取User的分数,load Hero list,相加分数就OK. |
|
返回顶楼 | |