`
talin2010
  • 浏览: 502124 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

EJB3(中文版) 第十集 主键类和复合主键

阅读更多

有时关系映射要求一个主键由多个持久化属性复合而成,例如,我们的关系模型明确指明实体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(中文版)EJB3(中文版)EJB3(中文版)EJB3(中文版)

    精通EJB3.0 中文版 3/3

    第二部分重点关注EJB编程的具体内容和过程,向开发者展示了如何使用会话Bean、将会话Bean发布为Web服务、消息驱动Bean;第三部分专注于高级EJB专题;第四部分是附录,收集了EJB组件技术相关的其他内容。

    EJB API中文版

    EJB API中文版,很详细的ejb api的中文版本,就像是jdk api一样

    EJB3的三本好书第3本 Mastering EJB3 4ed

    EJB3的三本好书之三,也很不错的一本ejb3的书籍,是英文版,附带源代码,这本书的好处是与Mastering EJB 3ed有一定的继承性,可以对比来看. 3本书的地址 1. Beginning EJB3 Application Development From Novice to ...

    EJB3的三本好书第2本, EJB3 in Action 2007

    EJB3的三本好书第二本,最好的介绍ejb3的书,看过之后,其他的书都送人了,而且附带的源代码,几乎包括了所有的主流应用服务器的例子,glassfish, jboss, weblogic, oracleAS 3本书分别是: 1. Beginning EJB3 ...

    精通EJB3.0 中文版 1/3

    第二部分重点关注EJB编程的具体内容和过程,向开发者展示了如何使用会话Bean、将会话Bean发布为Web服务、消息驱动Bean;第三部分专注于高级EJB专题;第四部分是附录,收集了EJB组件技术相关的其他内容。

    ejb3(中文版).pdf

    ejb3部分章节中文版,对学习ejb3有很大帮助

    EJB3.0中文 版

    本教程适合具有Java 语言基础的EJB 初学者。有读者来邮件问需不需要先学EJB2.0,作者明确地告诉你不用 学了。随着EJB3 的发展,EJB2 将会逐步成为历史。

    实战EJB 实战EJB 实战EJB

    实战EJB 实战EJB 实战EJB 电子书 pdf

    EJB2和EJB3的架构异同.doc

    EJB2和EJB3的架构异同?详细讲解 EJB编程模型的简化 JPA替代实体Bean 拦截器概念

    ejb3 带源码

    Mastering+EJB3 EJB3+IN+ACTION Beginning+EJB3+Application+Development

    EJB3开发Entity

    EJB3开发Entity EJB3开发Entity

    EJB规范中文简版(3本)

    EJB3核心规范 EJB3持久化规范(简体中文版) MS1_1规范(简体中文版)

    EJB3入门例子

    EJB3入门例子,jboss5+EJB3+myEclipse

    EJB方面 ejb pdf

    EJB方面EJB方面EJB方面EJB方面EJB方面

    EJB3(中文版)PDF

    EJB3.0(中文版)

    EJB3 PPT教程

    自己总结的EJB3上课教案,包括SessionBean、EntityBean、MDB、O/R映射与继承映射、持久化实体管理器、EJB3-QL、JTA等的教案.

    EJB3一对多和多对一关系映射实例

    EJB3一对多和多对一关系映射实例

    EJB3实战——Java

    实战、实战、EJB、EJB、EJB 3、EJB 3

Global site tag (gtag.js) - Google Analytics