【hibernate框架】如何配置联合主键-XML与Annotation样例剖析
2015-01-30 11:58
501 查看
首先看看什么是联合主键:
联合主键一般以表中的两个或两个以上的元素作为主键。
一般的联合主键,在数据库中设置就可以了。但是,如果你想用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):
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:
//运行测试类后,数据库自己去建立表,而且你会发现id和name都是主键
方法2:
只需要在实体类的主键get方法上加:@EmbeddedId
方法3:
在实体类上的主键get方法上注解@Id
在实体类的头来标示主键的类:
最常用的是第1和第二种方法。
转载请注明出处:http://blog.csdn.net/acmman
联合主键一般以表中的两个或两个以上的元素作为主键。
一般的联合主键,在数据库中设置就可以了。但是,如果你想用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
相关文章推荐
- Hibernate 联合主键的xml配置
- Hibernate xml配置方法 之 联合主键
- Hibernate基于XML的----联合主键配置
- Hibernate xml配置方法之联合主键
- 【Hibernate框架开发之四】Hibernate-Annotation常用的注解归总&&ID的生成策略&&联合主键
- hibernate 联合主键应用及配置用xml方式实现
- hibernate 联合主键生成机制(组合主键XML配置方式)
- 【hibernate框架】uuid与native生成ID的样例-XML配置
- Hibernate联合主键怎样在xml中配置
- 【Hibernate框架开发之四】Hibernate-Annotation常用的注解归总&&ID的生成策略&&联合主键
- hibernate 联合主键生成机制(组合主键XML配置方式)
- Hibernate联合主键关联(Annotation配置)
- hibernate 联合主键生成机制(组合主键XML配置方式)
- hibernate如何配置联合主键
- 【Hibernate框架开发之四】Annotation注解归总&ID生成策略&联合主键
- hibernate 联合主键 注释配置
- Hibernate 使用 Annotation 之 联合主键
- Hibernate复合主键使用组件方式的hbm.xml配置与集合配置
- hibernate一对一单向外键关联_Annotation_联合主键
- Hibernate一对一主键双向关联映射(xml配置)