首页 > 其他分享 >@IdClass 注解和@Id JPA联合主键和注意事项

@IdClass 注解和@Id JPA联合主键和注意事项

时间:2023-07-13 12:55:45浏览次数:68  
标签:String JPA phone 注解 import IdClass 主键 name

@IdClass 注解和@Id JPA联合主键
原文链接:https://www.hxstrive.com/subject/open_jpa/538.htm

前面章节已经介绍了 @Id 注解,该注解定义实体类中某个属性为数据库的主键,一个实体里面必须有一个主键。本章节将介绍 @IdClass 注解,该注解用来为某个实体指定复合主键,复合主键存放在一个单独的类当中。

符合主键类需要要满足以下要求:

  • 必须实现 Serializable 接口;

  • 必须有默认的 public 无参数的构造方法;

  • 必须覆盖 equals 和 hashCode 方法。equals 方法用于判断两个对象是否相同,EntityManger 通过 find 方法来查找 Entity 时是根据 equals 的返回值来判断的。hashCode 方法返回当前对象的哈希码,生成的 hashCode 相同的概率越小越好,算法可以进行优化。

实例

(1)假设我们拥有一张 users2 表,该表使用 “name” + “phone” 作为复合主键。SQL 脚本如下:

1234567CREATE TABLE `users2` (  `namevarchar(100) NOT NULL,  `phone` varchar(15) NOT NULL,  `email` varchar(100) DEFAULT NULL,  `address` varchar(255) DEFAULT NULL,  PRIMARY KEY (`name`,`phone`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(2)为上面的 users2 表的复合主键 “name” + “phone” 创建复合主键 User11Key.java 类,代码如下:

123456789101112131415import lombok.Data;import java.io.Serializable; @Datapublic class User11Key implements Serializable {    private String name;    private String phone;     public User11Key() {}     public User11Key(String name, String phone) {        this.name = name;        this.phone = phone;    }}

(3)为 users2 表创建一个实体类,在实体类上面使用 @IdClass 注解指定复合主键。同时,需要在 name 和 phone 字段上面使用 @Id 注解标记为主键。代码如下:

123456789101112131415161718192021222324import lombok.Data;import javax.persistence.*; @Data@Entity@Table(name = "users2")@IdClass(value = User11Key.class)public class User11 {    // 指定为主键    @Id    @Column(nullable = false)    private String name;     // 指定为主键    @Id    @Column(nullable = false)    private String phone;     @Column    private String email;     @Column    private String address;}

(4)客户端代码,使用 EntityManager 的实例根据复合主键查询 users 表中的数据。代码如下:

123456789101112131415161718192021222324252627282930import com.alibaba.fastjson.JSONObject;import com.huangx.openjpa.annotation.entity.User11;import com.huangx.openjpa.annotation.entity.User11Key;import javax.jws.soap.SOAPBinding;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import javax.persistence.Query;import java.util.List; public class OpenJpaDemo11 {    /** 持久化单元名称 */    private static final String NAME = "openJPA";     public static void main(String[] args) {        EntityManagerFactory emf = Persistence.createEntityManagerFactory(NAME);        EntityManager em = emf.createEntityManager();        em.getTransaction().begin();         // 根据主键查询数据        User11 user = em.find(User11.classnew User11Key("张三""15188994534"));        System.out.println(JSONObject.toJSONString(user));         em.getTransaction().commit();        em.close();        emf.close();        System.out.println("finished.");    } }


标签:String,JPA,phone,注解,import,IdClass,主键,name
From: https://www.cnblogs.com/sunny3158/p/17550169.html

相关文章

  • 效率排序:count(字段)<count(主键id)<count(1)≈count(*)
    参考文档1https://blog.csdn.net/zhangzl1012/article/details/78056904?locationNum=5&fps=1参考文档2https://blog.csdn.net/qq_34481955/article/details/120867482?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST......
  • oracle中实现主键的自动增加
    实现方法1:建立一个最小为1,最大为nomaxvalue的一个序列号会自动循环的序列createsequence序列名incrementby1startwith1nomaxvaluenocycle;当向表中插入数据时,SQL语句写法如下:SQL>insertinto表名values(序列名.nextval,列1值,列2值,...);当要重用该序列号......
  • 69. JPA实体Bean的生命周期
     【从零开始学习SpirngBoot—常见异常汇总】      在使用JPA的时候,如果对bean的生命周期不了解的话,难免会碰到一些问题,比如:InvalidDataAccessApiUsageException:Removingadetachedinstance。      那么这一小节说说实体Bean的生命周期。1、实体Bean生命周期的4......
  • SQLServer中查询表结构(表主键 、列说明、列数据类型、所有表名)的Sql语句
    --快速查看表结构SELECT CASEWHENcol.colorder=1THENobj.name                 ELSE''            ENDAS表名,       col.colorderAS序号,       col.nameAS列名,       ISNULL(ep.[value],'')AS列说......
  • 视图中的难点:主键表 About Key-Preserved Tables
    http://wmlm.itpub.net/post/12871/278640因为在项目中大量地使用了视图,而在视图上的更新上产生了一点儿问题,所以抽时间对可更新视图进行了复习,英文看得多了,也就成了中文 测试用表CREATETABLEDept_tab(DeptnoNUMBER(4)PRIMARYKEY,DnameVARCHAR2(14),LocVARCHAR2(13));CR......
  • SQL主键和约束
    SQL主键和约束原创 Lyle_Tu Linux分布式主任 2023-06-1717:08 发表于福建收录于合集#sql5个#数据库7个#linux36个#服务器18个 主键1.工具创建表 列 数据类型 是否null      一个表中,会存很多条记录,需要一个列来唯一标识一条数据。    ......
  • 删除主键
    删除表中已有的主键约束(1)有命名 altertablestudentsdropconstraintyy;(2)无命名可用SELECT  *  from  user_cons_columns;查找表中主键名称得student表中的主键名为SYS_C002715altertablestudentdropconstraintSYS_C00271......
  • NHibernate主键生成方式
    User.hbm.xml<?xmlversinotallow="1.0"encoding="utf-8"?><hibernate-mappingxmlns="urn:nhibernate-mapping-2.2"><classname="PreordainSolution.PreordainModel.User,PreordainSolution.PreordainModel&quo......
  • 主键索引、唯一索引和普通索引的关系
    主键索引:在数据库中定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。主键索引不能为空。每个表只能有一个主键唯一索引:不允许两行具有相同的索引值。但可以都为NULL。如果......
  • 8. 使用JPA保存数据【从零开始学Spring Boot】
    在看这一篇文档的话,需要先配置好JPA–Hibernate。      总体步骤:(1)  创建实体类Demo,如果已经存在,可以忽略。(2)  创建jparepository类操作持久化。(3)  创建service类。(4)  创建restful请求类。(5)  测试 代码如下:com.kfit.test.bean.Demo:package......