Hibernate各种映射关系总结

Hibernate各种映射关系总结。



1 多对一

第一步 :建立对象模型

User                                            

-----------------------------

id:int

name:String

group:Group

Group

------------------------------

id:int

name:String

 

 

第二步:映射文件

<?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="com.nintenyun.hibernate">
   <class name="User" table="t_user">
      <id name="id" column="id">
        <generator class="identity"/>
      </id>
      <property name="name" column="User_name" unique="true"/>
      <many-to-one name="group" column="groupid"/>
   </class>
</hibernate-mapping>
 

 

2 一对一映射

2.1 主键映射

 

1. 建立对象模型

 

Person[id-int,name-String]

IdCard[id-int,cardNo-int]

 

2. 映射文件

<?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="com.nintenyun.hibernate">
   <class name="Person" table="t_person">
      <id name="id">
        <generator class="foreign">
        <param name="property">idCard</param>
        </generator>
      </id>
      <property name="name" column="Person_name" />
      <one-to-one name="idCard" constrained="true"/>
   </class>
</hibernate-mapping>
 

2.2 主键映射双向

只需要在IdCard 的XML中添加<one-to-one>标签指向person,就可以告诉Hibernate如何加载person,默认按照主键加载

 

2.3 外键关联映射

 

1. 对象模型

 

Person[id-int,name-String,idcard-IdCard]

IdCard[id-int,cardNo-int]

 

2 mapping文件

 

Person.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="com.nintenyun.hibernate">
   <class name="Person" table="t_person">
      <id name="id">
        <generator class="identity">
        </generator>
      </id>
      <property name="name" column="Person_name" />
      <many-to-one name="idCard" unique="true"></many-to-one>
   </class>
</hibernate-mapping>
 

2.4 one-to-one 外键双向mapping

 

只需要在另一端(IdCard)加入<one-to-one>标签,但是hibernate默认按照主键加载,所以要告诉hibernate按照指定列来加载

示意:

 

Id-card
<?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="com.nintenyun.hibernate">
   <class name="IdCard" table="t_idcard">
      <id name="id" column="id">
        <generator class="identity"/>
      </id>
      <property name="cardNo" column="cardno" />
      <one-to-one name="person" property-ref






="idCard"></one-to-one>
   </class>
</hibernate-mapping>
 

3 一对多映射

 

1  建立对象模型

 

Classes[id-int,name-String,student-Set]

Student[id-int,name-String]

 

2  映射文件

 

 

<?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="com.nintenyun.hibernate">
   <class name="Class" table="t_class">
      <id name="id">
        <generator class="native"/>
      </id>
      <property name="name" />
      <set name="student" >
      <key column="classid" />
      <one-to-many class="Student"/>
      </set>
   </class>
</hibernate-mapping>
 

缺点:若将Student的classid设置为非空,将无法保存。应为不是student这一端维护关系,所以student不知道是哪个班级,所以需要发出多余的update语句来更新关系。

(一对多): 先要session.sava(学生),再sessio.save(班级)

(多对一): 先要session.sava(班级),再sessio.save(学生)

 

改进 采用 一对多双向关联

   <set name="student" inverse="true">
 

这样的好处是 存入数据让多的一端进行维护,不需要发出多余的update.

 

 

4 多对多mapping

单向(采用第三方表)

1  对象模型

Role[id-int,name-String]

User[id-int,name-String,role-Set]

 

2映射文件

<?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="com.nintenyun.hibernate">
   <class name="User" table="t_user">
      <id name="id">
        <generator class="native"/>
      </id>
      <property name="name" />
      <set name="role" table="t_user_role">
      <key column="userid"></key>
      <many-to-many class="Role" column="roleid" />
      </set>
   </class>
</hibernate-mapping>

 

双向:

1 对象模型:

Role[id-int,name-String,user-Set]

User[id-int,name-String,role-Set]

 

2 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="com.nintenyun.hibernate">
   <class name="Role" table="t_role">
      <id name="id">
        <generator class="native"/>
      </id>
      <property name="name" />
      <set name="user" table="t_user_role">
      <key column="userid"></key>
      <many-to-many class="User" column="userid" />
      </set>
   </class>
</hibernate-mapping>

 

 

 

5 继承mapping

 

第一类继承映射

 

 

 

1 对象模型

 

Animal
private int id
private String name
private Boolean sex

--------------------------------------------------

public class Bird extends Animal
private int height

--------------------------------------------------

public class Pig extends Animal
private int weight

 

 

 

2 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="com.nintenyun.hibernate">
   <class name="Animal" table="t_animal" >
      <id name="id" >
        <generator class="native"/>
      </id>
      <discriminator column="type" type="string"></discriminator>
      <property name="name"/>
      <property name="sex"/>
      <subclass name="Pig" discriminator-value="P">
      	<property name="weight"/>
      </subclass>
      <subclass name="Bird" discriminator-value="B">
      	<property name="height"/>
      </subclass>
   </class>
  

   
</hibernate-mapping>
 

第二类mapping

 

1 对象模型

 

2 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="com.nintenyun.hibernate">
   <class name="Animal" table="t_animal" >
      <id name="id" >
        <generator class="native"/>
      </id>
     <property name="name"/>
     <property name="sex"/>
        <joined-subclass name="Pig" table="t_pig">
        	<key column="pid"/>
        	<property name="weight"/>
        </joined-subclass>
        <joined-subclass name="Bird" table="t_bird">
        	<key column="bid"/>
        	<property name="height"/>
        </joined-subclass>
</class> 
</hibernate-mapping>
 

 

3 第三类mapping

1对象模型

2 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="com.nintenyun.hibernate">
   <class name="Animal" table="t_animal" >
      <id name="id" >
        <generator class="native"/>
      </id>
     <property name="name"/>
     <property name="sex"/>
     <union-subclass name="Pig" table="t_pig">
     <property name="weight"/>
     </union-subclass>
     <union-subclass name="Bird" table="t_bird">
     <property name="height"/>
     </union-subclass>
</class>
</hibernate-mapping>
 

 

6 Component 映射

 

component不是实体,没有OID。

 

1 对象模型

 

public class Employee
private int id

private String name
private Contact contact

-------------------------------------

public class Contact 

private String email
private String address
private String zipcode
private String contactTel

-------------------------------------

public class User 

private int id
private String name
private Contact contact

 

 

2 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="com.nintenyun.hibernate">
   <class name="User" table="t_user" >
      <id name="id" >
        <generator class="native"/>
      </id>
      <property name="name"/>
      <component name="contact">
      <property name="email"></property>
      <property name="address"></property>
      <property name="zipcode"></property>
      <property name="contactTel"></property>
   	  </component>
   </class>
 </hibernate-mapping>
 

 

7 复合主键mapping

 

通常将复合主键相关属性,单独放到一个类中

这个类必须实现 Serializable接口

这个类必须重写hashCode()和equals()方法

 

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="com.nintenyun.hibernate">
   <class name="SC" table="t_sc" >
   		<composite-id name="scpk">
    		<key-property name="sno"/>
    		<key-property name="cno"/>
    	</composite-id>  
    	<property name="sname"></property>
    	<property name="cname"></property>
   </class>
</hibernate-mapping>
 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值