有时关系映射要求一个主键由多个持久化属性复合而成,例如,我们的关系模型明确指明实体Customer的唯一标识通过
last name和安全码代替自动生成的数字键.这些被称作复合主键.Java持久化规范提供了多种途径映射这种类型的模型。
其中的一种是通过@javax.persistence.IdClass.注释;其它的是通过@javax.persistence.EmbeddedId注释.
6.3.4.1. @IdClass 注释
第一种方法定义主键类(和复合主键)使用@IdClass注释.组件类不用使用主键在其中.但是不使用它来与实体管理器
交互当查找一个持久化对象通过它的主键.@IdClass是类级的注释并且指定那个键类将被使用当与实体管理器交互时.
@Target(TYPE)
@Retention(RUNTIME)
public @interface IdClass
{
Class value( );
}
在你的组件类中,你指明一个或多个属性做为主键,使用@ID注释.这些属性将映射, 成准确的属性在@IdClass.
让我们看以下将Customer组件类改成复合主键为name和安全码.首先,让我们定义一个主键类:
package com.titan.domain;
public class CustomerPK
implements java.io.Serializable {
private String lastName;
private long ssn;
public CustomerPK( ) {}
public CustomerPK(String lastName, long ssn)
{
this.lastName = lastName;
this.ssn = ssn;
}
public String getLastName( ) { return this.lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
public long getSsn( ) { return ssn; }
public void setSsn(long ssn) { this.ssn = ssn; }
public boolean equals(Object obj)
{
if (obj == this) return true;
if (!(obj instanceof CustomerPK)) return false;
CustomerPK pk = (CustomerPK)obj;
if (!lastName.equals(pk.lastName)) return false;
if (ssn != pk.ssn) return false;
return true;
}
public int hashCode( )
{
return lastName.hashCode( ) + (int)ssn;
}
}
主键类必需满足下列条件:
※必需被序列化
※必需有一个公共的无参构造方法
※必需实现equals()和hashCode()方法
Customer组件必需有同样要求的属性同CustomerPK类的属性被加上@Id注释的.
package com.titan.domain;
import javax.persistence.*;
@Entity
@IdClass(CustomerPK.class)
public class Customer implements java.io.Serializable {
private String firstName;
private String lastName;
private long ssn;
public String getFirstName( ) { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
@Id
public String getLastName( ) { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
@Id
public long getSsn( ) { return ssn; }
public void setSsn(long ssn) { this.ssn = ssn; }
}
注意:主键自动生成不支持复合键和主键类.你需要手工创建键值.
让我们看一下等价的XML文件:
<entity-mappings>
<entity class="com.titan.domain.Customer" access="PROPERTY">
<id-class>com.titan.domain.CustomerPK</id-class>
<attributes>
<id name="lastName"/>
<id name="ssn"/>
</attributes>
</entity>
</entity-mappings>
<id-class>元素是<entity>的子元素,并且它的值是完全有资格做主键类的类名,注意,多个<id>元素映射成主键类.
主键类用于当你查询Customer组件时:
CustomerPK pk = new CustomerPK("Burke", 9999999);
Customer cust = entityManager.find(Customer.class, pk);
无论你何时调用EntityManager的方法像find()或getreference(),你必需使用主键类才能识别这个实体.
修正: EJB3(中文版) 第七集 Secondary Tables中产生警告的原因,是因为数据库中没有与实体对应的表.
我的联系方式:
QQ:495585885
Email:liuyuhui_007@yahoo.com.cn
我的博客:http://hi.baidu.com/vsandjava
下载地址:
1.主页公布的邮箱
2.http://lyh007.gbaopan.com/files/49e8686840a84012ad61cf61c2ea9f50.gbp
分享到:
相关推荐
ejb3中文版
EJB3(中文版)EJB3(中文版)EJB3(中文版)EJB3(中文版)EJB3(中文版)EJB3(中文版)EJB3(中文版)
第二部分重点关注EJB编程的具体内容和过程,向开发者展示了如何使用会话Bean、将会话Bean发布为Web服务、消息驱动Bean;第三部分专注于高级EJB专题;第四部分是附录,收集了EJB组件技术相关的其他内容。
EJB API中文版,很详细的ejb api的中文版本,就像是jdk api一样
EJB3的三本好书之三,也很不错的一本ejb3的书籍,是英文版,附带源代码,这本书的好处是与Mastering EJB 3ed有一定的继承性,可以对比来看. 3本书的地址 1. Beginning EJB3 Application Development From Novice to ...
EJB3的三本好书第二本,最好的介绍ejb3的书,看过之后,其他的书都送人了,而且附带的源代码,几乎包括了所有的主流应用服务器的例子,glassfish, jboss, weblogic, oracleAS 3本书分别是: 1. Beginning EJB3 ...
第二部分重点关注EJB编程的具体内容和过程,向开发者展示了如何使用会话Bean、将会话Bean发布为Web服务、消息驱动Bean;第三部分专注于高级EJB专题;第四部分是附录,收集了EJB组件技术相关的其他内容。
ejb3部分章节中文版,对学习ejb3有很大帮助
本教程适合具有Java 语言基础的EJB 初学者。有读者来邮件问需不需要先学EJB2.0,作者明确地告诉你不用 学了。随着EJB3 的发展,EJB2 将会逐步成为历史。
实战EJB 实战EJB 实战EJB 电子书 pdf
EJB2和EJB3的架构异同?详细讲解 EJB编程模型的简化 JPA替代实体Bean 拦截器概念
Mastering+EJB3 EJB3+IN+ACTION Beginning+EJB3+Application+Development
EJB3开发Entity EJB3开发Entity
EJB3核心规范 EJB3持久化规范(简体中文版) MS1_1规范(简体中文版)
EJB3入门例子,jboss5+EJB3+myEclipse
EJB方面EJB方面EJB方面EJB方面EJB方面
EJB3.0(中文版)
自己总结的EJB3上课教案,包括SessionBean、EntityBean、MDB、O/R映射与继承映射、持久化实体管理器、EJB3-QL、JTA等的教案.
EJB3一对多和多对一关系映射实例
实战、实战、EJB、EJB、EJB 3、EJB 3