首先说,表间关系可以说有4种,也可以说有3种,也可以说2种。
4种:一对一,一对多,多对一,多对多
3种:一对一,(一对多和多对一算一种),多对多
2种:一对一,一对多(因为多对多也就是多了个中间表,都是与中间表关联,终究还是两表一对多的关系)
那么在hibernate中怎么去配置来阐述表之间的这些关系呢,在数据库里表间关系都是通过外键维护的(即使是一对一的关系,无非两种情况,要么在同一张表中然后两个字段都非空唯一,要么在两张表中,然后其中一表有个字段为外键,此外键也非空唯一),那么今天我们只要搞定怎么在hibernate中使用配置来描述数据库中的外键关系,就能在hibernate中描述清楚表与表(或者对象与对象之间的关系了),直接上代码:
有一张user 表和一张 dog表,dog的dogmaster是外键,关联着user表的id
两个实体类大致如下:
private int id;
private String username;
private String password;
private Set<Dog> dogs = new HashSet<Dog>(0);
private int dogid;
private String dogname;
private String dogcolor;
private int dogage ;
private User dogmaster;
那么两个XML文件我们这么配置:
<hibernate-mapping package="com.dimples.dao">
<class name="User" table="user">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="username" column="username"></property>
<property name="password" column="password"></property><!--name是指定属性的没什么好说,table是指定要针对哪张表建外键,column是指定哪个字段,至于最后一个字段可能是为了方便封装返回记录时好用吧,不太清楚。。。-->
<set name="dogs" table="dog">
<key column="dogmaster"></key>
<one-to-many class="Dog"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping package="com.dimples.dao">
<class name="Dog" table="dog">
<id name="dogid" column="dogid">
<generator class="native"></generator>
</id>
<property name="dogname" column="dogname"></property>
<property name="dogcolor" column="dogcolor"></property>
<property name="dogage" column="dogage"></property>
<!--这里由标签many-to-one知道是要对dog表创外键,然后column是用来指定在这个表的哪个字段上创外键,class是告诉你外键依赖的主表是哪张表-->
<many-to-one name="dogmaster" column="dogmaster" class="User"></many-to-one>
</class> </hibernate-mapping>你会发现我两个xml中都配置了外键关系,对吧?理论上来说只要一方配置里阐述清楚关系里,数据库就能建立起对应的表关系,事实上也确实是这,所以我们可以只配User.hbm.xml或者Dog.hbm.xml,或者两者都配置上,那么具体到底该怎么选择呢?看业务,当我们的业务是这样:根据人id查询所拥有的