码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JPA之使用复合主键


    文章目录

      • 1. 目标
      • 2. 数据库设计
      • 3. Entity 定义
      • 4. 使用
      • 5. 源码

    1. 目标

    在设计数据库表的时候,有时候不想定义没有意义的Id作为主键,就可以使用复合主键。这个时候使用JPA进行操作,应该如何使用复合主键?这里使用@IdClass。

    2. 数据库设计

    create table if not exists watch(
        brand varchar (20),
        name varchar (20),
        color varchar (20),
        stock int ,
        primary key (brand, name, color)
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3. Entity 定义

    import org.apache.commons.lang3.StringUtils
    import java.io.Serializable
    import javax.persistence.*
    
    
    @Entity
    @Table(name = "watch")
    @IdClass(WatchIdClass::class)
    data class WatchEntity(
        @Id
        @Column(name = "brand")
        val brand: String,
        @Id
        @Column(name = "name")
        val name: String,
        @Id
        @Column(name = "color")
        val color: String,
        @Column(name = "stock")
        val stock: Int
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    这里了使用了@IdClass注解,可以看到该注解的注释:

    Specifies a composite primary key class that is mapped to multiple fields or properties of the entity.
    The names of the fields or properties in the primary key class and the primary key fields or properties of the entity must correspond and their types must be the same.

    因此这里定义Id class

    data class WatchIdClass(
        var brand: String = StringUtils.EMPTY,
        var name: String =  StringUtils.EMPTY,
        var color: String =  StringUtils.EMPTY
    ) : Serializable
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这个IdClass需要实现Serializable接口。
    另外,由于使用的是koltin,需要这个类有默认的无参构造函数,因此加了默认值,这样会生成默认构造函数。

    4. 使用

    有了上面的定义之后,repository接口就可以正常使用了。这里举了个例子
    Repository定义:

    interface WatchRepository : JpaRepository<WatchEntity, String> {
        fun findByBrandAndNameAndColor(brand: String, name: String, color: String): WatchEntity
    }
    
    • 1
    • 2
    • 3

    Service:

    @Service
    class WatchService @Autowired constructor(private val watchRepository: WatchRepository) {
    
        fun getWatch(brand: String, name: String, color: String): WatchEntity {
            return watchRepository.findByBrandAndNameAndColor(brand, name, color)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5. 源码

    上述示例的代码在这里

  • 相关阅读:
    在VMware虚拟机中固定CentOS系统ip(使用桥接模式)
    hello world、hello 计科人
    k8s中部署nginx-ingress实现外部访问k8s集群内部服务
    入门电机系列之4步进电机
    七夕当然要学会SQL优化好早点下班去找对象
    [Machine Learning][Part 6]Cost Function代价函数和梯度正则化
    域名竞价要注意什么?
    Python和Excel的完美结合:常用操作汇总(案例详析)
    在Docker中运行Jenkins容器:从入门到实践
    世界各国自然资源租金面板数据
  • 原文地址:https://blog.csdn.net/Apple_wolf/article/details/126207812
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号