之前一直很迷惑,Hibernate的多对一和数据库表的多对一有什么关系?答案居然是没有关系。
Hibernate的多对一主要是为了便于管理数据库,主要是CIDR操作。
而数据库的多对一则是为了维持数据库的参照完整性。
两者之间没有直接的关系。
比如建立一个数据库,有文章、分类两个表
文章(文章编号,分类编号、文章内容)
分类(分类编号、分类名称)
文章表的分类编号属性参照分类表的主键,属于多对一的关系。这属于数据库的范畴,与Hibernate没有关系。
而在代码中,Hibernate的多对一配置是这样的。
Message类:
private int msg_id;
private int category_id;
private String content;
priavte Category category;
Message.hbm.xm配置l:
<many-to-one name = "category" class = "entity.Category"
column = "category_id">
</many-to-one>
Category类:
private int category_id;
private String Category_name;
private Set<Message> messages = new HashSet<Message>();
Category.hbm.xm配置l:
<set name = "messages" inverse = "true" cascade = "all">
<key column = "category_id"></key>
<one-to-many class = "entity.Message"></one-to-many>
</set>
上面的配置实现了文章与分类的双向多对一关联,这里的关联与数据库外键参照没有一对一的关系,而是为了更好的描述两个实体之间的包含关系,使得通过一个实体可以方便的获取与其关联的对象实体。实现的时候只要调用getMessages()方法就可以了。Hibernate可能是对Message表进行了一次查询,获取了所有分类号为指定编号的元组。