ORM进阶之Hibernate中关系映射

ORM进阶之 ORM简介

ORM进阶之Hibernate简介及框架搭

ORM进阶之Hibernate的三大对象

ORM进阶之Hibernate中对象的三大状态解析

ORM进阶之Hibernate中一对一的关系映射

映射可以说是在hibernate中非常重要的一个内容,通过映射可以让程序员不再思考复杂的sql语句,而是更加的专注于业务逻辑的实现。映射通过一个xml配置文件完成并且我们可以对他进行修改!下边我们来看一下如何完成映射的!

单表映射

每个实体对应一张表,跟其他的实体没有关联关系,这是最简单的一种方式,下边我们看一下,如何通过实体映射到数据库中。我们的实体User的代码

<span style="font-size:18px;">/**
 * User实体
 * @author hongjie
 *
 */
public class User {
   //主键
   private int id;
   //用户名
   private String username;
   //密码
   private String  passwords;
   public int getId() {
      return id;
   }
   public void setId(intid) {
      this.id = id;
   }
   public String getUsername() {
      return username;
   }
   public void setUsername(Stringusername) {
      this.username = username;
   }
   public String getPasswords() {
      return passwords;
   }
   public void setPasswords(Stringpasswords) {
      this.passwords = passwords;
   }
}</span>

映射文件的代码User.hbm.xml 的代码

<span style="font-size:18px;"><?xml version="1.0"?>
<!DOCTYPE hibernate-mappingPUBLIC
   "-//Hibernate/Hibernate Mapping DTD3.0//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--package   对应实体所在包 -->
<hibernate-mappingpackage="com.tgb.domain">
<!-- table 为映射到数据库中的表名 , 默认与实体名一致 -->
   <class name="User" table="t_users">
      <id name="id" type="java.lang.Integer">
         <generator class="native"/>
      </id>
      <property name="username"/>
      <property name="passwords"/>
   </class>
</hibernate-mapping></span>

通过这样的简单的两个配置文件,就能将我们的实体映射到数据库中了!这也是最简单的一种映射方式。但是在实际中很少有所有的实体之间都没有关系的。

一对一关系映射

还有一种一对一的关系,比如说一个用户只能有一个身份证信息,我们要把身份证信息单独存储,这样我们的用户实体和身份证实体就是一个一对一的关系,肯定是先有人,然后才有身份证信息,所以用户应该为主,身份证信息为从,用户维护者身份证信息。hibernate的一对一关系有两种形式,一种是共享主键方式,另一种是唯一外键方式.。我们该怎么来表示这样关系呢! 看一下代码。

共享主键方式

顾名思义,就是一个人的两条记录使用同一个主键,当我们创建了用户后,在创建身份证信息时,他会自动去取他对应的用户信息的主键。这样就可以使用同一个主键了。

下边我们看一下代码,

package com.tgb.domain;
/**
 * User实体
 * @author hongjie
 *
 */
public class User {
	//主键
	private int id;
	//用户名
	private String username;
	//密码
	private String  passwords;
	//卡信息
	private Card card;

	public Card getCard() {
		return card;
	}
	public void setCard(Card card) {
		this.card = card;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPasswords() {
		return passwords;
	}
	public void setPasswords(String passwords) {
		this.passwords = passwords;
	}
}
</pre><pre name="code" class="html">public class Card {
	//主键
	private int cardId;
	//身份证信息
	private String cardInfo;
	//用户信息
	private User user;

	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public int getCardId() {
		return cardId;
	}
	public void setCardId(int cardId) {
		this.cardId = cardId;
	}
	public String getCardInfo() {
		return cardInfo;
	}
	public void setCardInfo(String cardInfo) {
		this.cardInfo = cardInfo;
	}

}

上边是两个实体的的代码,我们可以看到在user中具有card的引用,在card中也有user的引用,这样为双向关联,根据其中任何一个信息,都可以取到另一个信息。看一下我们配置文件的代码

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- package   对应实体所在包 -->
<hibernate-mapping package="com.tgb.domain">
<!-- 	table 为映射到数据库中的表名 , 默认与实体名一致 -->
	<class name="User" table="t_users" >
		<id name="id" type="java.lang.Integer">
			<generator class="native"/>
		</id>
		<property name="username"/>
		<property name="passwords"/>
		<!-- card关联, cascade="all" 对user的所有操作 都进行级联操作 -->
		<one-to-one name="card" class="Card" cascade="all"></one-to-one>
	</class>
</hibernate-mapping>
</pre><pre name="code" class="html"><?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- package   对应实体所在包 -->
<hibernate-mapping package="com.tgb.domain">
<!-- 	table 为映射到数据库中的表名 , 默认与实体名一致 -->
	<class name="Card" table="t_card" >
		<id name="id" type="java.lang.Integer">
			<generator class="foreign"><!--使用主键关联,引用User对应表的主键作为自己的主键-->
                    <param name="property">user</param><!--此处的user必须和下面配置的one-to-one的name属性一样 -->
                </generator>
		</id>
		<property name="cardInfo"/>
        <!-- 用户属性,constrained在这里必须为true 这里使用的是双向关联映射,要不然会有重复数据读。 -->
		<one-to-one name="user" class="User" constrained="true"></one-to-one>
	</class>
</hibernate-mapping>

通过上边的配置文件,我们就创建好了一个一对一的唯一主键关联映射。下边我们在看一下一对一的另一种实现方式外键关联。

外键关联

我们pojo类,还是上边的那两个类,我们只是修改了配置文件,配置文件如下

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- package   对应实体所在包 -->
<hibernate-mapping package="com.tgb.domain">
<!-- 	table 为映射到数据库中的表名 , 默认与实体名一致 -->
	<class name="User" table="t_users" >
		<id name="id" type="java.lang.Integer">
			<generator class="native"/>
		</id>
		<property name="username"/>
		<property name="passwords"/>
<!-- 		持有card 的属性,  -->
	    <one-to-one name="card" class="Card" fetch="join" cascade="all" ></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">
<!-- package   对应实体所在包 -->
<hibernate-mapping package="com.tgb.domain">
<!-- 	table 为映射到数据库中的表名 , 默认与实体名一致 -->
	<class name="Card" table="t_card" >
		<id name="id" type="java.lang.Integer">
			<generator class="foreign"><!--使用主键关联,引用User对应表的主键作为自己的主键-->
                    <param name="property">user</param><!--此处的user必须和下面配置的one-to-one的name属性一样 -->
                </generator>
		</id>
		<property name="cardInfo"/>
<!-- 		该为多对一unique 设置为true,这样就保证了唯一性。 -->
         <many-to-one name="user" class="User" unique="true" ></many-to-one>
	</class>
</hibernate-mapping>

可以看到我们只是简单的修改了一下配置文件,就把他变成了唯一外键约束了。这样也可以实现一对一映射。 下篇博客将为大家讲解多对一映射,敬请期待。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-19 15:37:08

ORM进阶之Hibernate中关系映射的相关文章

ORM进阶之Hibernate中对象的三大状态解析

ORM进阶之 ORM简单介绍 ORM进阶之Hibernate简单介绍及框架搭 ORM进阶之Hibernate的三大对象 ORM进阶之Hibernate中对象的三大状态解析 在Hibernatea中每一个对象都有三种状态,他们在这三种状态下,Hibernate会他们进行不同的处理.下边我们通过一张图来看一下这三种状态以及他们之间的互相转换! 能够看到对象可能会有这三种状态.暂时状态(transient),持久化状态(persistent).游离状态(detached).下边我们来分别来解释一下这三

hibernate中关系映射

在数据库中数据的对应关系有一对一,一对多和多对一.那么在hibernate中应该如何对应呢?如下: 一对一: 假设两个实体,一个实体类为husband,另外一个实体类为wife.一个丈夫只能对应一个妻子,反之亦然.那么在hibernate中使用annotation如下:(husband类) 1 import javax.persistence.Entity; 2 import javax.persistence.GeneratedValue; 3 import javax.persistence

Hibernate中的映射关系(一对多)

在数据库中表和表之间的关系有几种,下面就详细说一下在Hibernate中怎样映射一对多的关系 Hibernate映射一对多的关系,其实就是持久类之间的映射,那如何把持久类关联起来呢??那就用到.hbm.xml文件的<many-to-one>标签了 具体做法如下: 新建一个customer类: package com.jeremy.hibernate.app.example; public class Customer { private Integer customerId; private

ORM进阶之Hibernate 的三大对象

ORM进阶之 ORM简介 ORM进阶之Hibernate 简介及框架搭 ORM进阶之Hibernate 的三大对象 我们在上一篇博客中讲到了如何搭建一个Hibernate框架, 提到Hibernate我们就不得不说他的三大对象,Configuration,SessionFactory , Session .下边我们就分别来解释一下这三大对象! Configuration对象 Configuration类用来管理我们的配置文件的信息的,通过它,我们可以通过创建一个configuration实例来管

【SSH高速进阶】——Hibernate 多对多映射

说到多对多关系.印象最深刻的就是大学的选修课.一个学生能够选修多门课程,一门课程能够有多个学生选修,学生所选的每一门课程还有成绩. 这个场景的E-R图例如以下: 对于多对多的关系,我们一般会抽出一张中间表(连接表),来负责维护这两张表的多对多关系.比方上述关系应该生成的表结构为: PO对象 Student.java public class Student { private int id; private String name; private Set<Course> courses; /

hibernate 实体关系映射笔记

@常用属性说明: @Entity:实体类 @Table:指定对应数据表 @Id:主键,使用可以为null值的类型,如果实体类没有保存到数据库是一个临时状态 @Column:配置普通属性,除了主键外,java基本类型的属性 @Base:普通属性的加载方式 @GeneratedValue:主键生成策略 @Temporal:日期类型(DATE,TIME还是TIMESTAMP),如果属性类型是java.util.Date(是以上3个类的父类)类型时才需要使用该@声明具体的日期类型 @Transient:

hibernate 对象关系映射文件详解

POJO 类和数据库的映射文件*.hbm.xml POJO类和关系数据库之间的映射可以用一个XML文档来定义. 映射文件的扩展名为.hbm.xml 在运行时Hibernate将根据这个映射文件来生成各种SQL语句 通过POJO类的数据库映射文件,Hibernate可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据库表列之间的对应关系 映射文件说明 hibernate-mapping 类层次:class 主键:id 基本类型:property 实体引用类: many-to-one

Hibernate Annotation关系映射, 级联cascade属性

Hibernate Annotation关系映射, 级联cascade属性一. Hibernate Annotation关系映射 1.一对一外键关联映射(单向) 2.一对一外键关联映射(双向) 3.一对一主键关联映射(不重要)在这不演示 在实际中很少用,使用注解@PrimaryKeyJoinColumn 意思是说,我的主键去参考另外一张表中的主键,作为我的主键,但是在我测试使用 注解一对一主键关联映射,在生成表的时候,数据库中并没有生成关联,使用XML 映射可以生成.Annotation注解一对

hibernate继承关系映射和java反射机制的运用

转:http://blog.csdn.net/derpvailzhangfan/article/details/1957946 ,感谢博主分享 Notes:hibernate元数据的运用:uuid的概念:java的反射机制,“因为抽象类无法new出对象来,所以就要用java反射机制”,“TcommTable tomm = (TcommTable) Class.forName(allName).newInstance();”: hibernate继承关系映射大概有5种,这5种继承关系映射里面,我觉