首页 > 其他分享 >JPA中@ElementCollection使用

JPA中@ElementCollection使用

时间:2023-11-29 12:32:39浏览次数:34  
标签:实体类 映射 JPA ElementCollection user 使用 id User

转载请注明出处:

  在JPA中,@ElementCollection注解主要用于映射集合属性,例如List、Set或数组等集合属性,以及Map结构的集合属性,每个属性值都有对应的key映射。这个注解可以用于实体类的字段,表示该字段是一个元素集合,每个元素都会被映射到数据库中的一行。

  例如,假设我们有一个User实体类,每个用户可以有多个电话号码,我们可以使用@ElementCollection注解来映射这个一对多的关系:

@Entity
public class User {
  @Id
  @GeneratedValue
  private Long id;

  private String name;

  @ElementCollection
  private List<String> phoneNumbers;
}

  在这个例子中,phoneNumbers字段是一个List<String>,每个电话号码都会被映射到数据库中的一行。数据库中会有一个额外的表来存储这些电话号码,这个表的每一行都包含一个用户的ID和一个电话号码。

  @ElementCollection注解还可以和@CollectionTable注解一起使用,来指定映射集合属性的表的名称和结构。例如:

@Entity
public class User {
  @Id
  @GeneratedValue
  private Long id;

  private String name;

  @ElementCollection
  @CollectionTable(name = "user_phones", joinColumns = @JoinColumn(name = "user_id"))
  private List<String> phoneNumbers;
}

  在这个例子中,@CollectionTable注解指定了映射集合属性的表的名称为user_phones,并且定义了一个名为user_id的外键列,这个外键列引用了User实体类的ID。

  需要注意的是,@ElementCollection注解只能用于映射基本类型和嵌入式类型,不能用于映射实体类。如果需要映射实体类,应该使用@OneToMany@ManyToMany注解。

  在数据库中,@ElementCollection注解对应的字段值会被保存在一个单独的表中,每个元素都会被映射到这个表的一行。这个表的每一行都包含一个外键列,这个外键列引用了主实体类的ID,以及一个或多个列来存储元素的值。

  例如,在上面的User实体类的例子中,phoneNumbers字段的值会被保存在user_phones表中,这个表的每一行都包含一个user_id列来引用User实体类的ID,以及一个phone_number列来存储电话号码的值。

  在JPA中,@ElementCollection注解对应的字段值在数据库中保存的方式是一条数据对应一行。例如,如果一个用户有多个电话号码,那么这些电话号码在user_phones表中会被保存为多条数据,每个电话号码对应一行。

  user_phones表的表结构通常包含以下字段:

  • 外键列:这个列用于引用主实体类的ID。在上面的User实体类的例子中,这个列的名称是user_id
  • 元素值列:这个列用于存储元素的值。在上面的User实体类的例子中,这个列的名称是phone_number

  以下是user_phones表的创建语句:

CREATE TABLE user_phones (
 user_id BIGINT,
 phone_number VARCHAR(255),
 PRIMARY KEY (user_id, phone_number),
 FOREIGN KEY (user_id) REFERENCES User(id)
);

  在这个创建语句中,user_id列是一个外键列,它引用了User实体类的ID。phone_number列是一个元素值列,它用于存储电话号码的值。user_idphone_number列一起构成了主键,这意味着每个用户的每个电话号码都会被存储为一个唯一的行。

 



标签:实体类,映射,JPA,ElementCollection,user,使用,id,User
From: https://blog.51cto.com/u_15535797/8614470

相关文章

  • influxdb 连续查询使用总结
    转载请注明出处:1.定义:InfluxDB连续查询(ContinuousQuery)是一种自动化查询类型,该查询会根据定义的时间间隔定期运行,并将结果存储在新的目标测量中。这样的查询通常用于处理大量时间序列数据。2.基本语法使用语法格式:CREATECONTINUOUSQUERY<cq_name>ON<db_name>BEGIN......
  • javaswing 文本框的使用lambal表达式的应用
    package百度翻译实验;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JTextField;publicclassframeextendsJFrame......
  • 使用Golang构建高性能网络爬虫
    前段时间和以前公司的老同事聚会,喝酒中无意聊到目前他们公司在做的一个爬虫项目,因为效率低下,整个人每天忙的不可开交。借着这次聚会,正好询问我一些解决方案。于是,我给了他们我的一些思路。所谓的高性能网络爬虫就是一种能够快速、高效地从互联网上抓取大量网页数据的程序。网络爬虫......
  • langchain中的chat models介绍和使用
    简介之前我们介绍了LLM模式,这种模式是就是文本输入,然后文本输出。chatmodels是基于LLM模式的更加高级的模式。他的输入和输出是格式化的chatmessages。一起来看看如何在langchain中使用cahtmodels吧。chatmodels的使用首先langchain对chatmodels下支持的模型就少很多了。一方......
  • 服务器数据恢复—V7000存储raid5热备盘同步失败导致Mdisk失效,上层卷无法使用的数据恢
    服务器数据恢复环境:某品牌V7000存储中有一组由几十块硬盘组建的raid5阵列。上层操作系统为windowsserver,NTFS分区。服务器故障:有一块硬盘出现故障离线,热备盘自动上线替换离线硬盘。在热备盘上线同步数据的过程,与离线盘同一组Mdisk中又有另一块磁盘出现故障离线。热备盘同步失败......
  • 强化学习:AC算法中为什么不使用Q函数来表示优势函数
      《High-DimensionalContinuousControlUsingGeneralizedAdvantageEstimation》      ====================== 原论文: ......
  • 使用AI辅助写代码
    市面上的AI写代码GitHub+OpenAI出品的Copilot:https://copilot.github.com/Tabnie:CodeFasterwithAICodeCompletions|TabnineKite:https://github.com/kiteco,2022.11.16已停止服务MachineLearningCodeCompletion:jetbrains系列自带的插件支持工具:jetbrains全系列,vs/vscode,......
  • Base64编码、解码 C语言例子(使用OpenSSL库)
    #include<stdio.h>#include<string.h>#include<unistd.h>#include<openssl/pem.h>#include<openssl/bio.h>#include<openssl/evp.h>intbase64_encode(char*in_str,intin_len,char*out_str){BIO*b64,*bio;......
  • SpringBoot JPA实践之EntityManage查询返回自定义DTO entityManager.createNativeQuer
    SpringBootJPA实践之EntityManage查询返回自定义DTOentityManager.createNativeQuery(sql)  在很多时候我更喜欢随意组合查询出来返回一个DTO对象的实现,JPA提供的多数查询均以返回Entity居多,它提供的EntityManager对象可以实现将SQL语句查询的结果转换为自定义DTO对象(这与......
  • 使用emqttd时执行emqttd console时无反应或者报错Node undefined not responding to p
    1.无反应:  2.报错:Nodeundefinednotrespondingtopings. 解决办法:路径不能有空格,最好用存英文的路径。......