hibernate--联合主键(了解+,掌握-)
如果一个表有多个主键(= =一般比较少)
8.4. 组件作为联合标识符(Components as composite identifiers)
(实现接口,implems java.io.Serializable(把当前对象序列化的接口)),
package com.zjx.hibernate;
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;
	}
	@Override
	public boolean equals(Object o) {         //判断是否相等,相等就找它
		if(o instanceof StudentPK) {  //如果o是一个StudentPK对象
			StudentPK pk = (StudentPK)o;
			if(this.id == pk.getId() && this.name.equals(pk.getName())) {
				return true;
			}
		}
		return false;
	}
	@Override
	public int hashCode() {   //计算主键的hash码  if有多个对象 就直接找hash码
		return this.name.hashCode();
	}
}
package com.zjx.hibernate;
public class Student {
	private StudentPK pk;
	private int age;
	private String sex;
	private boolean good;
	public boolean isGood() {
		return good;
	}
	public void setGood(boolean good) {
		this.good = good;
	}
	/*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;
	}*/
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public StudentPK getPk() {
		return pk;
	}
	public void setPk(StudentPK pk) {
		this.pk = pk;
	}
}
<?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>
<class name="com.bjsxt.hibernate.Student"> <composite-id name="pk" class="com.zjx.hibernate.StudentPK">
<key-property name="id"></key-property>
<key-property name="name"></key-property>
</composite-id> <property name="age" />
<property name="sex" />
<property name="good" type="yes_no"></property>
</class> </hibernate-mapping>
2.2.. 映射主键属性
下面是定义组合主键的几种语法:
- 将组件类注解为@Embeddable,并将组件的属性注解为@Id(比较少用)
 - 将组件的属性注解为@EmbeddedId
 - 将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id
 
对于EJB2的开发人员来说 @IdClass是很常见的, 但是对于Hibernate的用户来说就是一个崭新的用法.
组合主键类对应了一个实体类中的多个字段或属性,
而且主键类中用于定义主键的字段或属性和 实体类中对应的字段或属性在类型上必须一致.下面我们看一个例子:
@Entity
@IdClass(FootballerPk.class)
public class Footballer {
//part of the id key
@Id public String getFirstname() {
return firstname;
} public void setFirstname(String firstname) {
this.firstname = firstname;
} //part of the id key
@Id public String getLastname() {
return lastname;
} public void setLastname(String lastname) {
this.lastname = lastname;
} public String getClub() {
return club;
} public void setClub(String club) {
this.club = club;
} //appropriate equals() and hashCode() implementation
} @Embeddable
public class FootballerPk implements Serializable {
//same name and type as in Footballer
public String getFirstname() {
return firstname;
} public void setFirstname(String firstname) {
this.firstname = firstname;
} //same name and type as in Footballer
public String getLastname() {
return lastname;
} public void setLastname(String lastname) {
this.lastname = lastname;
} //appropriate equals() and hashCode() implementation
}
如上, @IdClass指向对应的主键类.
Hibernate支持在组合标识符中定义关联(就像使用普通的注解一样),而EJB3规范并不支持此类用法.
@Entity
@AssociationOverride( name="id.channel", joinColumns = @JoinColumn(name="chan_id") )
public class TvMagazin {
@EmbeddedId public TvMagazinPk id;
@Temporal(TemporalType.TIME) Date time;
} @Embeddable
public class TvMagazinPk implements Serializable {
@ManyToOne
public Channel channel;
public String name;
@ManyToOne
public Presenter presenter;
}
@IdClass(TeacherPK.class);
t.setName("t1");
版权声明:本文为博主原创文章,未经博主允许不得转载。
hibernate--联合主键(了解+,掌握-)的更多相关文章
- hibernate 联合主键生成机制(组合主键XML配置方式)
		
hibernate 联合主键生成机制(组合主键XML配置方式) 如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体 ...
 - 这是一个hibernate 联合主键的例子
		
package com.bird.entity; import java.io.Serializable; import javax.persistence.Entity; import javax. ...
 - Java进阶知识05 Hibernate联合主键之Annotation(注解)和XML实现方式
		
1.Hibernate联合主键(Annotation实现) 1.1.单列主键 1.1.1.为什么要有主键? //唯一确定一条记录 1.1.2.一个表能否有多个主键? //不能 1.1.3. ...
 - hibernate 联合主键 composite-id
		
如果表使用联合主键(一个表有两个以上的主键),你可以映射类的多个属性为标识符属性.如:<composite-id>元素接受<key-property> 属性映射(单表映射)和& ...
 - Hibernate联合主键映射
		
1.联合主键的映射规则 1) 类中的每个主键属性都对应到数据表中的每个主键列. Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法, ...
 - hibernate 联合主键
		
xml方式处理联合主键: 以有两个主键:id和name的student表为例. 先创建个主键类: package com.bjsxt.hibernate; //黑色为必写项 public ...
 - hibernate  ——联合主键
		
接上一篇博客:http://www.cnblogs.com/tengpan-cn/p/5551323.html 主键类不需要写任何注解,表对象类使用@IdClass注解 在表对象类前面加@IdClas ...
 - hibernate联合主键 注解方式
		
转载自https://my.oschina.net/yotoo/blog/265571 方法一:主键类用@Embeddable,pojo类仍然用@Entity但是引用主键类的对象用@Id 主键pojo ...
 - hibernate联合主键注解配置
		
在网上看到好多方法,结果拿来用还是出现了一些问题.现在整理一下 1.主键类 import javax.persistence.Column; public class UserRoleUionPK i ...
 - hibernate联合主键注解方式
		
方法一:主键类用@Embeddable,pojo类仍然用@Entity但是引用主键类的对象用@Id 主键pojo类: @Embeddable public class composeIdPK impl ...
 
随机推荐
- Dynamic view
			
Views are a useful feature of SQL databases, letting us create virtual tables based on SQL select st ...
 - Zookeeper 脑裂
			
转自 http://blog.csdn.net/u010185262/article/details/49910301 Zookeeper zookeeper是一个分布式应用程序的协调服务.它是一个为 ...
 - thinkphp foreach循环生成二维数组的方法
			
先做个问题记录,另外下面是做的过程中遇到的一个没想明白的现象 foreach($result as $key => $val ){ $wzList[$key]['lik']=$val[0]; $ ...
 - js 触发select onchange事件
			
select 或text的onchange事件需要手动(通过键盘输入)改变select或text的值才能触发,本文为大家介绍下使用js触发select onchange事件select 或text的o ...
 - PHP isset()与empty()的区别详解
			
通过对PHP语言的学习,应该知道它是基于函数的一款HTML脚本语言. 庞大的函数库支持着PHP语言功能的实现. 有关PHP函数isset()与empty()的相关用法. PHP的isset()函数 一 ...
 - nginx报file not found错误
			
查看错误日志 [:q2013/10/20 18:41:40 [error] 27151#0: *106117 FastCGI sent in stderr: "Primary script ...
 - SQL Server自增长列插入指定值 -- SET IDENTITY_INSERT ON|OFF(转)
			
想要将值插入到自动编号(或者说是标识列,IDENTITY)中去,需要设定 SET IDENTITY_INSERT 示例: 1.首先建立一个有标识列的表:CREATE TABLE products (i ...
 - php根据日期获得星期
			
<?php $weekarray=array("日","一","二","三","四",&quo ...
 - php下使用phpmailer发送邮件
			
由于默认虚拟空间不支持mail()函数,客户需要留言发送邮件,找到phpmailer发送不成功,调试成功后记录一下. 最新的下载地址在github,https://github.com/Synchro ...
 - caused by android.system.errnoexception open failed eacces (permission denied)解决方案,安卓6.0(API23)权限问题
			
在API23+以上,不止要在AndroidManifest.xml里面添加权限 <uses-permission android:name="android.permission.RE ...