首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在JPA/Hibernate中基于两个外键生成id?

在JPA/Hibernate中,可以通过使用@EmbeddedId注解和@MapsId注解来基于两个外键生成id。

首先,创建一个Embeddable类来表示复合主键。该类应该包含两个外键字段,并使用@Embeddable注解进行标注。例如:

代码语言:java
复制
@Embeddable
public class MyCompositeKey implements Serializable {
    @Column(name = "foreign_key1")
    private Long foreignKey1;

    @Column(name = "foreign_key2")
    private Long foreignKey2;

    // 构造函数、getter和setter方法
}

然后,在实体类中使用@EmbeddedId注解将该Embeddable类作为主键。同时,使用@MapsId注解将外键与主键进行映射。例如:

代码语言:java
复制
@Entity
public class MyEntity {
    @EmbeddedId
    private MyCompositeKey id;

    @ManyToOne
    @JoinColumn(name = "foreign_key1", insertable = false, updatable = false)
    private ForeignKey1Entity foreignKey1Entity;

    @ManyToOne
    @JoinColumn(name = "foreign_key2", insertable = false, updatable = false)
    private ForeignKey2Entity foreignKey2Entity;

    // 其他属性和关联关系的定义
}

在上面的代码中,MyEntity类使用MyCompositeKey作为主键,并通过@MapsId注解将外键字段与主键进行映射。同时,使用@ManyToOne和@JoinColumn注解定义了与外键实体的关联关系。

通过以上配置,当保存MyEntity实体时,JPA/Hibernate会自动根据外键的值生成主键的值。

这种基于两个外键生成id的方式适用于具有复合关联关系的实体,例如多对多关系或多对一关系。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring全家桶之SpringData——Spring Data JPA

导入jar 两个核心jar 加上3个sl4j的jar 2. 在配置文件开启Spring Data JPA的命名空间以及它的约束 3. 在配置文件添加Spring Data JPA的配置 4....提供了一套基于JPA标准操作数据库的简化方案。底层默认的是依赖Hibernate JPA 来实现的。...HibernateHibernate Jpa 逆向工程: 通过数据库表自动创建对应的实体类以及查询方法 逆向工程的使用 测试类 注解名称 作用 @RunWith(SpringJUnit4ClassRunner.class...本项目是基于 Hibernate Jpa项目上构建 ,Hibernate Jpa查看上篇博文 ?...”),inverseJoinColumns=@JoinColumn(name=“menu_id”)) joinColumns:建立当前表在中间表字段 inverseJoinColumns :建立另一张表在中间表字段

3.7K10

jpaspringdata(1)jpa

hibernate作为orm  待续重写整个部分 3.jpa的配置简要说明 新建–jpa项目(自动生成jpa项目的xml文件) persistence.xml,文件的名称是固定的,然后是根据name=”...@GeneratedValue/*获取主键的方式,主键id的描述,在hibernate,以及mybatis的resultmap的都是描述为id标签, 这里获取主键的方式有IDENTITY:采用数据库...joinColumns={@JoinColumn(name="ITEM_ID", referencedColumnName="ID")},//joinColumns 映射当前类所在的表在中间表...,name 指定列的列名, referencedColumnName 指定列关联当前表的哪一列,inverseJoinColumns={@JoinColumn(name="CATEGORY_ID...", referencedColumnName="ID")})//inverseJoinColumns 映射关联的类所在中间表的 @ManyToMany public Set<Category

1.9K20

Spring 全家桶之 Spring Data JPA(四)

//声明主键 @GeneratedValue(strategy = GenerationType.IDENTITY)//声明主键生成策略 @Column(name = "cust_id"...(中间表):@JoinColumn,name字段名称,referenceColumnName参照主表的主键字段名称 * 在客户实体类上(一对多中一的这边)添加了配置,对于客户而言,具备了维护的作用...sql语句 查看数据库表,已更新,关联关系已经建立 在One2ManyTest在增加testSave1() // 只配置联系人到客户的关系 @Test @Transactional @Rollback...insert的时候就已经建立 查看数据库表,存在,关联关系建立成功 在One2ManyTest增加testSave2(),在linkManset customer,在customerset...()通过在customerset linkMan,同时在linkManset customer也可以建立两者之间的关系,后台执行了4条SQL语句,因此可以看出在一对多关系中一的一边建立维护关系可以执行较少的

1.6K20

使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置 顶

新建一个数据库springdemo,在数据库,有两张表:     (1)用户表user:用户登录信息,主键id设为自增;     (2)博文表blog:储存用户发表的博文,主键id设为自增,其中有一个...使用MySQL Workbench添加流程: ? ?...注意:在添加时,应该根据需求设置,例如右边红框的Foreign Key Options,默认在Delete时是NO ACTION,说明在删除一个用户时,如果数据库存在该用户的文章,那么就无法删除该用户...选中blog表然后点击“+”号按钮,添加关系(7)。 ? ?     点击OK后,在Database Schema Mapping可以发现多出了两个关系,如图所示: ?    ...再点击OK,稍后,打开model包,可以看到生成两个Java Bean,在SpringMVC称为两个实体,它们对应了数据库的两张表: ?

81520

使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置

新建一个数据库springdemo,在数据库,有两张表:     (1)用户表user:用户登录信息,主键id设为自增;     (2)博文表blog:储存用户发表的博文,主键id设为自增,其中有一个...使用MySQL Workbench添加流程: ? ?...注意:在添加时,应该根据需求设置,例如右边红框的Foreign Key Options,默认在Delete时是NO ACTION,说明在删除一个用户时,如果数据库存在该用户的文章,那么就无法删除该用户...选中blog表然后点击“+”号按钮,添加关系(7)。 ? ?     点击OK后,在Database Schema Mapping可以发现多出了两个关系,如图所示: ?    ...再点击OK,稍后,打开model包,可以看到生成两个Java Bean,在SpringMVC称为两个实体,它们对应了数据库的两张表: ?

1.6K10

JPA作持久层操作

在本表创建detail_id,并连接AccountDetail表的主键id @OneToOne //声明为一对一关系 AccountDetail detail;...ID为:"+account.getId()+",ID为:"+account.getDetail().getId()); } 可以看到日志结果:结束后会发现数据库两张表都同时存在数据。...插入时,自动生成的主键ID为:6,ID为:3 一对多 接着我们来看一对多关联,比如每个用户的成绩信息: Account类: @JoinColumn(name = "uid") //注意这里的name...inverseJoinColumns = @JoinColumn(name = "tid") //教师实体主键在关联表的字段名称,并在当前表创建tid字段作为连接关联表的tid...) List teacher; 接着,JPA会自动创建一张中间表,并自动设置,我们就可以将多对多关联信息编写在其中了。

1.1K10

高级框架-springDate-JPA 第二天【悟空教程】

JPA 第二天 第1章 JPA 的主键生成策略 通过annotation(注解)来映射实体类和数据库表的对应关系,基于annotation的主键标识为@Id注解, 其生成规则由@GeneratedValue...其中:JPA 提供的四种标准用法为 TABLE,SEQUENCE,IDENTITY,AUTO。由于我们使用的是 hibernate 实现,它也支持 hibernate 定义的生成规则。...@Id @GeneratedValue(strategy = GenerationType.AUTO) private Long custId; 1.2 使用 hibernate 的主键生成规则...1.2.1 hibernate 中提供的主键生成规则 在讲解 Hibernate 的主键生成策略之前,先来了解两个概念,即自然主键和代理主键,具体如下: 自然主键: 把具有业务含义的字段作为主键...在数据库建立一对多的关系,需要使用数据库的约束。 什么是? 指的是从表中有一列,取值参照主表的主键,这一列就是。 一对多数据库关系的建立,如下图所示 ?

2.5K10

JPA实体类的注解

,如果是逆向生成表的话就会以简单类名作为表名   如果指定名称,例如@Table(name="tb_user"),就表示映射到数据库的tb_userz这个表; @Id   标注于属性上,通常是在get...用于表示该属性作为ID主键 @GeneratedValue   主键生成策略,@GeneratedValue(strategy=GenerationType.AUTO)表示主键自增长由实现jpa的框架来控制...,例如我们用hibernate实现的就是有hibernate来控制   GenerationType总共有四个:   AUTO:   TABLE:由一个表来维护主键,这个表记录上一次生成的主键,然后+1...joinColum指关系维护端本身的 总结 关系被维护端用mapperBy来定义关系 关系维护端用joinColum来指定键名称,维护或者是@JoinTable通过中间表维护关系 *ToOne...@Id @Id设置对象表示符,标识的实体类的属性映射对应表的主键 @GeneratedValue 设置标识符的生成策略,常与@Id一起使用  参数:strategy指定具体的生成策略  方式一:@

3.8K70

一篇 JPA 总结

是实现:Hibernate 除了是一种 ORM 框架之外,他也是一种 JPA 实现 HelloWorld 步骤 创建 presitence.xml,在这个文件配置持久化单元 指定跟哪个数据库进行交互...默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer 对应 identity,MySQL 对应 auto increment IDENTITY:采用数据库 ID自增长的方式来自增主键字段...persistence():类似于 Hibernate Session 的 save 方法,但此方法所要存取的对象若有 id,那么会抛异常 ? ?...remove():类似于 Hibernate Session 的 delete 方法,但此方法只可删除持久化对象,而 hibernate 的方法可以删除游离对象(不在缓存,但在数据库可能有对象,...关联关系映射(使用 IDEA 可以使用实体生成表,也可以使用对应的额表逆向生成实体类) 单向多对一(orders - customer) 表结构(oreders 表中有 customer 表的映射

5.6K20

补习系列(19)-springboot JPA + PostGreSQL

, create-drop, validate, update)spring.jpa.hibernate.ddl-auto = update 其中,spring.jpa.hibernate.ddl-auto...这里为了演示多对一的关联,我们还会定义一个Author(作者信息)实体,书籍和实体通过一个(author_id)关联。...@GeneratedValue 用于指定ID主键的生成方式,GenerationType.IDENTITY 指采用数据库原生的自增方式, 对应到 PostGreSQL则会自动采用 BigSerial 做自增类型...ManyToOne 描述了一个多对一的关系,这里声明了其关联的"作者“实体,LAZY 方式指的是当执行属性访问时才真正去数据库查询数据; @JoinColumn 在这里配合使用,用于指定其关联的一个...@Temporal 则用于声明日期类型对应的格式,TIMESTAMP会对应 yyyy-MM-dd HH:mm:ss的格式,而这个也会被体现到DDL

2.1K70

Spring Data JPA(一):@id @generatedvalue设置初始值

SpringDataJPA是Spring Data的一个子项目,通过提供基于JPA的Repository极大的减少了JPA作为数据访问方案的代码量,你仅仅需要编写一个接口集成下SpringDataJPA...@Id 声明此属性为主键。该属性值可以通过应该自身创建,但是Hibernate推荐通过Hibernate生成 @GeneratedValue 指定主键的生成策略。...name 声明该表主键生成策略的名称,它被引用在@GeneratedValue设置的“generator”值; table 声明表生成策略所持久化的表名; pkColumnName 声明在持久化表...,该主键生成策略所对应键值的名称; valueColumnName 声明在持久化表,该主键当前所生成的值,它的值将会随着每次创建累加; pkColumnValue 声明在持久化表,该生成策略所对应的主键.../tree/master/initial-value-generator ---- JPA关系映射系列一:one-to-one关联 JPA关系映射系列二:one-to-one主键关联 JPA关系映射系列三

1.9K20

走进Java接口测试之持久层框架Spring-data-jpa

Spring-data-jpa Spring-data-jpa 是 Spring 基于 ORM 框架、 JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。...SQL 预先生成方法 Spring-data-jpa 默认预先生成了一些基本的CURD的方法,例如:增、删、改等等 /** * 继承JpaRepository,实现与数据库交互(JPA支持自动生成一些基本...该参数的几种配置如下: create:每次加载 hibernate 时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因...创建实体 创建一个 User实体,包含id(主键)、name(姓名)、age(年龄)属性,通过 ORM框架其会被映射到数据库表,由于配置了 hibernate.hbm2ddl.auto,在应用启动的时候框架会自动去数据库创建对应的表...在上例,我们可以看到下面两个函数: User findByName(String name) User findByNameAndAge(String name, Integer age) 它们分别实现了按

2.5K20
领券