【hibernate框架】如何配置联合主键-XML与Annotation样例剖析

简介:

首先看看什么是联合主键:

联合主键一般以表中的两个或两个以上的元素作为主键。


一般的联合主键,在数据库中设置就可以了。但是,如果你想用hibernate对主键做映射的话,则需要用面向对象的方法去操作它。


那么,如何用面向对象的方法去得到它呢?而又如何以面向对象的方式分配主键呢?


有两种方式:
XML配置联合主键和Annotation配置联合主键。

XML配置联合主键:

操作方式:
把多个主键封装在一个类中。
如Student类,如果以id和name为主键,那么就写一个类(StudentPK),将id和name作为成员变量(private),设置getter和setter方法。


在Student.hbm.xml中设置联合主键:

<!--设置联合主键-->
		<composite-id name="pk" class="cn.edu.hpu.model.StudentPK">
			<key-property name="id"></key-property>
			<key-property name="name"></key-property>
		</composite-id>
        <property name="name"></property>
        <property name="age"></property>
此方法要继承implements java.io.Serializable接口,实现序列化。
序列化是干什么的?序列化是可以把对象写到硬盘上,或可以通过网络传输对象。
为什么要实现序列化呢?
1、Student在数据库表中可能存在多条记录,这多条记录放在内存中就是多个Student对象,每一个对象都有一个PK联合主键。如果以后系统要做集群,好多服务器要同时对外提供服务,某台服务器出问题了,可以把这台服务器的对象传给另外一个服务器,这时候要实现序列化。
2、加入内存满了,可以使用虚拟内存,就是把硬盘上的一部分空间作为内存来使用。这个时候要把内存放在硬盘中,就要实现序列化。




联合主键类(StudentPK):
package cn.edu.hpu.model;


public class StudentPK implements java.io.Serializable{
	private int id;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	//联合主键的实体类一定要重写Object类的equals()和hsahCode()方法
	//一系列对象放到内存中,是要做区分的,所以为了保证唯一性,要重写equals()和hsahCode()方法
	//下面是改写的方法
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof StudentPK){
			StudentPK o=(StudentPK)obj;
			if(this.id==o.getId()&&this.name.equals(o.getName())){
				return true;
			}
		}
		return false;
	}
	
	//为什么要改写hashCode?hashCode是干嘛的?
	//如果说我们这个对象被装在内存的哈希表里面,查内容是否相同的时候首先查它的哈希表
	//哈希表底层是由数组(往往是链表)实现的。
	//如果哈希码相同,对象会被装在同一个位置。
	
	/*假如我们将来写了一个程序,我们要把一系列
	 * 的Student对象装到哈希表里,这个时候我们要计算Student的哈希码才能
	 * 装到哈希表里。我不会直接计算Student的哈希码,因为数据库是以主键
	 * 来区分对象的,所以我应该把主键的哈希码计算出来。
	 * 假设哈希码为2,我们把对象存到为2的位置。当我们找Student
	 * 的时候,在找哈希码为2的学生,并找里面equals的对象
	 * */
	@Override
	public int hashCode() {
		return this.name.hashCode();
	}
	
		
}

Annotation配置联合主键:

下面是定义联合主键的几种方法:
1.将组件类注解为@Embeddable,并将组件的属性注解为@Id。
2.将组件的属性注解为@EmbeddedId。
3.将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id。


方法1:
实体类Teacher:

package cn.edu.hpu.model;


import java.util.Date;


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;


//‘@+语句’就叫做注解
//@Entity表示这家伙是个实体类


//@Table(name="_teacher")
//指定实体类对应的表名(如果没有这个表hibernate会自动创建)


@Entity 
@Table(name="_teacher")
public class Teacher {
	private teacherPK PK;
	private String title;
	private Date brithday;
	private ZhiCheng zhicheng;
	
	@Id
	public teacherPK getPK() {
		return PK;
	}
	public void setPK(teacherPK pK) {
		PK = pK;
	}
	
	@Enumerated(EnumType.STRING)
	public ZhiCheng getZhicheng() {
		return zhicheng;
	}
	public void setZhicheng(ZhiCheng zhicheng) {
		this.zhicheng = zhicheng;
	}
	@Temporal(TemporalType.DATE)
	public Date getBrithday() {
		return brithday;
	}
	public void setBrithday(Date brithday) {
		this.brithday = brithday;
	}
	@Column(name="_title")
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
}



//联合主键类teacherPK:
package cn.edu.hpu.model;


import javax.persistence.Embeddable;


//@Embeddable表示是另外一个类的一部分
@Embeddable
public class teacherPK implements java.io.Serializable{
	private int id;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof StudentPK){
			StudentPK o=(StudentPK)obj;
		if(this.id==o.getId()&&this.name.equals(o.getName())){
				return true;
			}
		}
		return false;
	}
	
	@Override
	public int hashCode() {
		return this.name.hashCode();
	}
}

//运行测试类后,数据库自己去建立表,而且你会发现id和name都是主键






方法2:
只需要在实体类的主键get方法上加:@EmbeddedId
package cn.edu.hpu.model;


import java.util.Date;


import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;


@Entity 
@Table(name="_teacher")
public class Teacher {
	private teacherPK PK;
	private String title;
	private Date brithday;
	private ZhiCheng zhicheng;
	
	@EmbeddedId
	public teacherPK getPK() {
		return PK;
	}
	public void setPK(teacherPK pK) {
		PK = pK;
	}
	
	@Enumerated(EnumType.STRING)
	public ZhiCheng getZhicheng() {
		return zhicheng;
	}
	public void setZhicheng(ZhiCheng zhicheng) {
		this.zhicheng = zhicheng;
	}
	@Temporal(TemporalType.DATE)
	public Date getBrithday() {
		return brithday;
	}
	public void setBrithday(Date brithday) {
		this.brithday = brithday;
	}
	@Column(name="_title")
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
}



方法3:
在实体类上的主键get方法上注解@Id
        @Id
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}


在实体类的头来标示主键的类:
@IdClass(value=teacherPK.class)
public class Teacher {......

最常用的是第1和第二种方法。


转载请注明出处http://blog.csdn.net/acmman

相关文章
|
4月前
|
XML Ubuntu Linux
部署08---扩展-Win10配置WSL(Ubuntu)环境,WSL系统是什么意思,是Windows系统上的一个子系统, xml的一大特点是直链系统,直接链接你的CPU,硬盘和内存,如何用 WSL部署
部署08---扩展-Win10配置WSL(Ubuntu)环境,WSL系统是什么意思,是Windows系统上的一个子系统, xml的一大特点是直链系统,直接链接你的CPU,硬盘和内存,如何用 WSL部署
|
2月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
180 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
2月前
|
XML Java 应用服务中间件
springMVC01,springMVC的执行流程【第一个springMVC例子(XML配置版本):HelloWorld】
通过一个HelloWorld实例,介绍了SpringMVC的基本概念、执行流程,并详细讲解了如何创建和配置第一个SpringMVC项目(基于XML)。
springMVC01,springMVC的执行流程【第一个springMVC例子(XML配置版本):HelloWorld】
|
23天前
|
XML 分布式计算 资源调度
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(一)
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(一)
110 5
|
23天前
|
XML 资源调度 网络协议
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(二)
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(二)
50 4
|
23天前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
57 4
|
18天前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
59 0
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
42 1
|
3月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
43 1
|
3月前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
74 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧

相关课程

更多