hibernate之关系映射方式

在数据库中 ,可以通过sql语句来设置外键约束

constraint 外键名 foreign key 外键的id references 外键的表(对应的属性),例如  CONSTRAINTworktime_employee_fk FOREIGN KEY(e_id) REFERENCES employee(id)


在hibernate中可以通过在各自的实体类.hbm.xml中设置

一、一对多的关系和多对一的关系

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        
        <hibernate-mapping package="hibernate_b_example">
        	<class name="Dept" table="depts">
        		<id name="id">
        			<generator class="native" />
        		</id>
      
      			<property name="name" />
      			
      			
      			<!-- employees属性,表示本类与Employee的一对多的关系 -->
      			<set name="employees" cascade="all">
      				<key column="deptid"></key>
      				<one-to-many class="Employee" />
      			</set>
      			
        	</class>
        </hibernate-mapping>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        
        <hibernate-mapping package="hibernate_b_example">
        	<class name="Employee" table="employee">
        		<id name="id">
        			<generator class="native" />
        		</id>
      
      			<property name="name" />
      			
      			<!-- dept属性,表示本类与Dept的多对一的关系 -->
      			<many-to-one name="dept" class="Dept" column="deptid" />
      			
        	</class>
        </hibernate-mapping>

在一对多和多对一的关系中,在多的那方设置外键,在一的那方拿到多的那方的外键,即可在数据库中进行创建了。



二、多对多的关系

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        
        <hibernate-mapping package="hibernate_c_example">
        	<class name="Student" table="student">
        		<id name="id">
        			<generator class="native" />
        		</id>
      
      			<property name="name" />
      			
      			<!-- teachers属性,表示和Teacher的多对多关系 -->
      			<set name="teachers" table="teacher_student">
      				<key column="studentId"></key>
      				<many-to-many class="Teacher" column="teacherId" />
      			</set>
      			
      			
        	</class>
        </hibernate-mapping>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        
        <hibernate-mapping package="hibernate_c_example">
        	<class name="Teacher" table="teacher">
        		<id name="id">
        			<generator class="native" />
        		</id>
      
      			<property name="name" />
      			
      			
      			<!-- students属性,表示和Student类的多对多关系  -->
      			<set name="students" table="teacher_student">
      				<key column="teacherId"></key>
      				<many-to-many class="Student" column="studentId" />
      			</set>
      			
      			
        	</class>
        </hibernate-mapping>

在多对多的关系中,需要建立的是三个表,两个实体类的表和一个联系表,在联系表中通过各自的主键和外键进行联系



三、一对一的关系

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        
        <hibernate-mapping package="hibernate_a_example">
        	<class name="Person" table="person">
        		<id name="id">
        			<generator class="native" />
        		</id>
      
      			<property name="name" />
      			<!-- idCard属性,IdCard类型。
					表达的是本类与IdCard的一对一。
					采用基于外键的一对一映射方式,本方无外键方。
					property-ref属性:
						写的是对方映射中外键列对应的属性名。	
				 -->
			<one-to-one name="idCard" class="IdCard" property-ref="person"/>
		
      			
        	</class>
        </hibernate-mapping>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        
        <hibernate-mapping package="hibernate_a_example">
        	<class name="IdCard" table="idcard">
        		<id name="id">
        			<generator class="native" />
        		</id>
      
      			<property name="number" />
      			<!-- person属性,Person类型。
					表达的是本类与Person的一对一。
					采用基于外键的一对一映射方式,本方有外键方。 -->
      			<many-to-one name="person" class="Person" column="personId" unique="true"></many-to-one>
		
      			
        	</class>
        </hibernate-mapping>

对于一对一 的关系中,还有一种方式是两个实体都不需要外键的形式,通过主键的各自对应,主键即是外键来设置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        
        <hibernate-mapping package="hibernate_b_example">
        	<class name="Person" table="person01">
        		<id name="id">
        			<generator class="native" />
        		</id>
      
      			<property name="name" />
      		
			
					<!-- idCard属性,IdCard类型。
						表达的是本类与IdCard的一对一。
						采用基于主键的一对一映射方式,本方无外键方。
					 -->
					<one-to-one name="idCard" class="IdCard"></one-to-one>
      			
        	</class>
        </hibernate-mapping>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        
        <hibernate-mapping package="hibernate_b_example">
        	<class name="IdCard" table="idcard01">
        		<id name="id">
        		<!-- 当使用基于主键的一对一映射时,
				有外键方的主键生成策略一定要是foreign。
				参数property:
					生成主键值时所根据的对象。
				 -->
        			<generator class="foreign" >
        				<param name="property">person</param>
        			</generator>
        		</id>
      
      			<property name="number" />
      			
      			<!-- person属性,Person类型。
					表达的是本类与Person的一对一。
					采用基于主键的一对一映射方式,本方有外键方。 -->
			<one-to-one name="person" class="Person"  constrained="true"></one-to-one>
		
      			
        	</class>
        </hibernate-mapping>

关于一对一的关系一共有两种方式,不同建议是使用拥有外键的方式比较好,如果通过主键即是外键这种方式,主键不能为空和0,所以有限制。



上面的实例是在对对象的对应关系,下面是对字符的对应关系

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        
        <hibernate-mapping package="hibernate_a_example">
        	<class name="User" table="users">
        		<id name="id">
        			<generator class="native" />
        		</id>
      
      			<property name="name" />
      			
      			<set name="addressSet" order-by="address desc" table="user_address">
      				<key column="userid"></key>
      				<element type="string" column="address"></element>
      			</set>
      
      			<list name="addressList" table="user_addressList">
					<key column="userId"></key>
					<list-index column="idx"></list-index>
					<element type="string" column="address"></element>
				</list>
      			
      			<map name="addressMap" table="user_addressMap">
      				<key column="userId"></key>
      				<map-key type="string" column="key_"></map-key>
      				<element column="address" type="string"></element>
      				
      			</map>
      			
      			
      			
        	</class>
        </hibernate-mapping>


通过这些的对应的关系的实例,能够帮助快速的对hibernate的对应管理有一定的了解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值