关于hibernate中配置表之间的关系

首先说,表间关系可以说有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查询所拥有的

猜你喜欢

转载自blog.csdn.net/dimples_qian/article/details/80856336
今日推荐