请教hibernate实体设计问题

对于信息发布系统来说,肯定要有分类字段,如一条新闻有一级分类和二级分类。
在这里,按照我的设计, 二级分类和一级分类都是一个实体,他们之间是多对一的关系(双向关联)。然后再和一条新闻关联,新闻和第一类别应该是多对一的关系(双向关联)。
请问bang大哥,我这样的设计有没有问题呢。
如果这样设计的话,操作起来感觉非常的麻烦。特别是如果这个类别再和其他实体进行关联,那就需要设立更多的外健。

对于类别这样的实体的建模还向bang您请教。

类别再和其它实体关联,没看懂是什么意思。

二级分类和一级分类应该都是实体,并且是同一个实体类的不同对象,是一对多双向自关联关系,news和category是单向多对一关联,双向要lazyload。
[该贴被freebox于2008-06-01 15:40修改过]

freebox果然很强。

@类别再和其它实体关联,没看懂是什么意思
--
这里假如加入了另一个实体,也要用到这个分类实体(为了可复用性)。
如果是单向关联得话,也得要在多方设立外键字段。这样在category里就有了两个外键了。这样设计合不合理呢。

@news和category是单向多对一关联
--
如果设立为单向关联得话,这里category肯定是一方,按照我得理解,就是category知道他得news,但是news不知道他得category。这样news就不好得到它得category。不知道我理解得对不对。

我是hibernate初学者,如果不对请指出来。谢谢

在使用hibernate中,对于lazy得使用总是显得有点害怕。
例如一个 people 关联到 一个company(为了方便使用lazy,我使用了一对多关系),一个company关联到 由该 company发布得信息,同时该信息还有图片作为单独得实体。这样都用lazy显然关联得太多了。我想问一下得是lazy一般深入到几层,才能对整体的性能有一个比较好的平衡呢。

二级分类和一级分类可以用compiste模式实现封装起来,然后只要其中一个分类做代表和新闻发生单向关联就可以,是新闻内部聚合一个分类的方式。可看看Evans DDD看看实体和关联设计方面建议

画不好图,用code说明吧,我一般都弄个简化的关联模型代码出来代替图。


class Category{
private List<Category> children;
private Category parent;
}

class News{
private Category category;
}
class OtherThing{
private Category category;
}

我对hibernate的机制其实了解并不多,不过从以上模型看,News和OtherThing是感知Category的,而Category并不知道究竟是谁在使用它。从News查询Category是join(左?右?已经忘记大量sql的写法了)查询。
如果面对上千万News是不能不lazyload的,而且即使设置了lazyload也是需要分页抓取的。
from News news where news.category=oneCategory ...(分页);
多对一单向关联要从Category查询News或OtherThing是要自己写查询器的,但我不明白您为什么要同时得到一个Category中的News和OtherThing及其它东西的集合,这说明要么OtherThing和News是另一个实体X的两个组装配件,共享X中的category,要么就是同一个(还未被发现的)实体。

感谢freebox。
现在我对Hibernate也只能算个初学者,结合Struts2和Spring,使用Hibernate总感觉到有点担心,怕哪里设置的不好影响整个系统性能。现在感觉把hibernate使用的不伦不类。
我想,要用好Hibernate不是一件容易的事情,它在建模上有非常高的要求。

现在还想问的一个问题是。
现在我使用Struts2的Action作为控制层,由于页面也用Struts2的标签,这样使得页面和Action的整合非常容易,我留下的Service层的功能却变得非常的有限。但是Service层确是非常重要的一层,我把事务控制放在了这一层。我想问的是如何把Action层的功能简化,把它推向Service层呢。

hibernate价值在于缓存,用好了不存在性能问题。
service属于领域层次,能够脱离表现而存在,代表着领域的接口。
而action是表现层次上的东西,是要和界面元素(请求、会话)相关联并处理它们的,但做为领域层次是不需要知道这些的。
所以我认为是先设计好领域层次,当它能够完成一切领域作业之后,由这些接口来说明action到底需要为它提供什么。