`

处理联合主键

阅读更多
有时一个实体的主键可能同时为多个,例如同样是之前使用的“CustomerEO”实体,需要通过name和email来查找指定实体,当且仅当name和email的值完全相同时,才认为是相同的实体对象。要配置这样的复合主键,步骤如以下所示。

(1)编写一个复合主键的类CustomerPK,代码如下。
CustomerPK.java

import java.io.Serializable;

public class CustomerPK implements Serializable {

 
         public CustomerPK() {

         }

         public CustomerPK(String name, String email) {

                   this.name = name;

                   this.email = email;
         }

 
         private String email;

         public String getEmail() {

                   return email;

         }
 

         public void setEmail(String email) {

                   this.email = email;

         }


         private String name;

         public String getName() {

                   return name;

         }

         public void setName(String name) {

                   this.name = name;

         }

 
         @Override

         public int hashCode() {

                   final int PRIME = 31;

                   int result = 1;

                   result = PRIME * result + ((email == null) ? 0 : email.hashCode());

                   result = PRIME * result + ((name == null) ? 0 : name.hashCode());

                   return result;

         }

         @Override

         public boolean equals(Object obj) {

                   if (this == obj)

                            return true;

                   if (obj == null)

                            return false;

                   if (getClass() != obj.getClass())

                            return false;

                   final CustomerPK other = (CustomerPK) obj;

                   if (email == null) {

                            if (other.email != null)

                                     return false;

                   } else if (!email.equals(other.email))

                            return false;

                   if (name == null) {

                            if (other.name != null)

                                     return false;

                   } else if (!name.equals(other.name))
                            return false;
                   return true;
         }
}

作为符合主键类,要满足以下几点要求。

l         必须实现Serializable接口。

l         必须有默认的public无参数的构造方法。

l         必须覆盖equals和hashCode方法。equals方法用于判断两个对象是否相同,EntityManger通过find方法来查找Entity时,是根据equals的返回值来判断的。本例中,只有对象的name和email值完全相同时或同一个对象时则返回true,否则返回false。hashCode方法返回当前对象的哈希码,生成的hashCode相同的概率越小越好,算法可以进行优化。

(2)通过@IdClass注释在实体中标注复合主键,实体代码如下。
@Entity

@Table(name = "customer")

@IdClass(CustomerPK.class)

public class CustomerEO implements java.io.Serializable {

 

         private Integer id;

 

         public Integer getId() {

                   return this.id;

         }

 

         public void setId(Integer id) {

                   this.id = id;

         }

         

         private String name;

 

@Id

         public String getName() {

                   return this.name;

         }

 

         public void setName(String name) {

                   this.name = name;

         }

         

         private String email;

@Id

         public String getEmail() {

                   return email;

         }

 

         public void setEmail(String email) {

                   this.email = email;

         }

}

标注复合主键时需要注意以下几个问题。
@IdClass标注用于标注实体所使用主键规则的类。它的定义如下所示。
@Target({TYPE}) @Retention(RUNTIME)

public @interface IdClass {

Class value();

}

属性Class表示符合主键所使用的类,本例中使用CustomerPK这个复合主键类。

l         在实体中同时标注主键的属性。本例中在email和name的getter方法前标注@Id,表示符合主键使用这两个属性。

(3)这样定义实体的复合主键后,通过以下代码便可以获得指定的实体对象:
CustomerPK cpk = new CustomerPK("Janet","janetvsfei@yahoo.com.cn");

    CustomerEO instance = entityManager.find(CustomerEO.class, cpk);


分享到:
评论

相关推荐

    spring自带的jdbcTemplate查询、插入预编译使用

    简单的jdbcTemplate预编译、回调等

    基于Java(SSM)+MySQL搭建的高并发秒杀系统【100012604】

    秒杀操作要做两件事情,一是商品减库存,二是插入秒杀详情:1. 系统异常:服务器的一些异常不可...3. 重复秒杀异常:当进行插入秒杀详情时,如果发现用户手机号和商品id的联合主键重复时,此时插入会失败,需要处理。

    oracle 数据按主键删除慢问题的解决方法

    根据表主键id删除一条数据,在PL/SQL上执行commit后执行时间都大于5秒。!!! 问题分析: 需求是删除一个主表A,另有两个附表建有此表的主键ID的外键。删除A表的数据级联删除另两个表的关联数据。增删改查使用...

    SpikeSystem:初期ssm +前端bootstrap + maven建造的高并发秒杀系统

    重复秒杀异常:当进行插入秒杀详情时,如果发现用户手机号和商品id的联合主键重复时,此时插入会失败,需要处理 2.如何处理异常 首先对每个情况创造一个异常类 /** * Created by Administrator on 2017/2/19. * ...

    基于java的企业级应用开发:MyBatis的关联映射.ppt

    产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键。 9.1 关联关系概述 在Java中,通过对象也可以进行关联关系描述,如图下图所示: 一对一 一对多 多对多 在本类中定义对方...

    2013-11-12最新完整版火车列车时刻表MYsql数据库

    数据库中车次和站序两个字段被设为联合主键,便于索引和查询。对于动车和高铁来说,票价字段依次代表一等座、二等座和特等座,对于其他车次来说,票价字段依次代表硬座,硬卧,软座,软卧。 其中,详细的车次信息...

    201207完整版列车时刻表 数据

    数据库中车次和站序两个字段被设为联合主键,便于索引和查询。对于动车和高铁来说,票价字段依次代表一等座、二等座和特等座,对于其他车次来说,票价字段依次代表硬座,硬卧,软座,软卧。 其中,详细的车次信息...

    201207完整版列车时刻表Access数据库下载

    数据库中车次和站序两个字段被设为联合主键,便于索引和查询。对于动车和高铁来说,票价字段依次代表一等座、二等座和特等座,对于其他车次来说,票价字段依次代表硬座,硬卧,软座,软卧。 其中,详细的车次信息...

    Mysql 进阶修行学习

    索引:结构、Btree、索引分类、索引语法、性能分析、执行频次、慢查询日志、show profiles、explain、使用规则(验证索引效率、最左前缀法则、索引失效情况、SQL提示、覆盖索引&回表查询、前缀索引、单列&联合索引、...

    AndroidSqlite数据库操作封装SQLiteUtils.zip

    缺点和不足:还没支持多对一或者一多的关系没支持联合主键没支持表的外键设计其他...实例:SqliteLookup(Android内查看Sqlite数据库利器): https://github.com/YeDaxia/SqliteLookup 标签:SQLiteUtils

    MyISAM InnoDB 区别

     4、从我接触的应用逻辑来说,select count(*) 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非...

    iBatis SQL Maps开发指南.pdf

    自动生成的主键 存储过程 parameterClass parameterMap Inline Parameter简介 resultClass resultMap cacheModel xmlResultName Parameter Map 和 Inline Parameter 元素 Inline Parameter Map 基本类型输入参数 Map...

    Hibernate实战(第2版 中文高清版)

     8.1.1 处理主键   8.1.2 带有公式的任意联结条件   8.1.3 联结任意的表   8.1.4 使用触发器   8.2 定制SQL   8.2.1 编写定制CRUD语句   8.2.2 整合存储过程和函数   8.3 改进Schema DDL   8.3.1 ...

    NHibernate参考文档 2.0.0 chm

    5.1.5. (联合主键)composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. 时间戳 (可选) 5.1.9. 属性 5.1.10. 多对一 5.1.11. 一对一 5.1.12. 组件(component), 动态组件(dynamic-...

    中国银保监会银行业金融机构监管数据标准化规范(2019版).xlsx

    10. 数据约束:数据结构备注中PK为监管部门作为唯一性约束的参考条件,含有多个PK的,表示联合主键的参考,并不作为主外键唯一性约束的条件,可根据数据实际使用用途情况作出调整。 11. 数据项报送:《规范》中所有...

    NHibernate中文帮组文档(2008.11月更新)

    5.1.5. (联合主键)composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. 时间戳 (可选) 5.1.9. 属性 5.1.10. 多对一 5.1.11. 一对一 5.1.12. 组件(component), 动态组件(dynamic-...

    SQL Server 2008编程入门经典(第3版)

    6.3.1 主键约束 6.3.2 外键约束 6.3.3 唯一约束 6.4 CHECK约束 6.5 DEFAuLT约束 6.5.1 在cREATETABLE语句中定义DEFAULT约束 6.5.2 在已存在的表中添加DEFAUIT约束 6.6 禁用约束 6.6.1 在创建约束时忽略无效的数据 ...

    2009达内SQL学习笔记

    大多数SQL实现支持以下类型的函数: 文本处理, 算术运算, 日期和时间, 数值处理。 Null:空值 空值当成无穷大处理,所有空值参与的运算皆为空。 空值与空值并不相等,因为空值不能直接运算。 如:prod_price...

    SQL性能优化

    1. 表的主键、外键必须有索引 2. 数据量超过 1000 行的表应该有索引 3. 经常与其它表进行连接的表,在边接字段上应建立索引 4. 经常出现在 where 子句中的字段且过滤性极强的,特别是大表的字段,应该建立索引 5. ...

Global site tag (gtag.js) - Google Analytics