JPA中@ElementCollection使用
转载请注明出处:
在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_id和phone_number列一起构成了主键,这意味着每个用户的每个电话号码都会被存储为一个唯一的行。
JPA中@ElementCollection使用的更多相关文章
- JPA学习---第九节:JPA中的一对多双向关联与级联操作
一.一对多双向关联与级联操作 1.创建项目,配置文件代码如下: <?xml version="1.0" encoding="UTF-8"?> < ...
- 4、JPA table主键生成策略(在JPA中table策略是首推!!!)
用 table 来生成主键详解 它是在不影响性能情况下,通用性最强的 JPA 主键生成器.这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题. initialValue不起 ...
- Hibernate JPA 中配置Ehcache二级缓存
在Hibernate3 JPA里配置了一下非分布式环境的二级缓存,效果不错.具体过程如下: 1, 需要引入的jar包 http://ehcache.org/downloads/catalog 下载的包 ...
- 使用JPA中@Query 注解实现update 操作
spring使用jpa进行update操作主要有两种方式: 1.调用保存实体的方法 1)保存一个实体:repository.save(T entity) 2)保存多个实体:repository.sav ...
- Jpa中设置OneToMany插入报异常解决办法
在Jpa中如果设置@OneToMany,但使用的时候,如果没有赋值,会报异常出现,这时只需要实例化一个空数组即可, 但类型一定要对应: 实例如下: newField.setxxxxxList(new ...
- JPA中EntityListeners注解的使用
使用场景 EntityListeners在jpa中使用,如果你是mybatis是不可以用的 它的意义 对实体属性变化的跟踪,它提供了保存前,保存后,更新前,更新后,删除前,删除后等状态,就像是拦截器一 ...
- Spring data JPA中使用Specifications动态构建查询
有时我们在查询某个实体的时候,给定的条件是不固定的,这是我们就需要动态 构建相应的查询语句,在JPA2.0中我们可以通过Criteria接口查询,JPA criteria查询.相比JPQL,其优势是类 ...
- JPA中建立数据库表和实体间映射小结
在JPA中,映射数据库表和实体的时候,需要注意一些细节如下, 实体类要用@Entity的注解: 要用 @Id 来注解一个主键: 如果跟数据库相关联,要用@Table注解相关数据库表: 实体类中字段需要 ...
- JPA中自动使用@Table(name = "userTab")后自动将表名、列名添加了下划线的问题
一.问题 JPA中自动使用@Table(name = "userTab")后自动将表名.列名添加了下划线的问题,如下图: 二.解决 在application.properties文 ...
- Spring Data JPA中的动态查询 时间日期
功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...
随机推荐
- HBase Compaction 原理与线上调优实践
作者:vivo 互联网存储技术团队- Hang Zhengbo 本文对 HBase Compaction 的原理.流程以及限流的策略进行了详细的介绍,列举了几个线上进行调优的案例,最后对 Compac ...
- 浏览器工作原理及V8引擎
浏览器解析过程 当浏览器加载html资源时,会进行如下的解析过程 遇见 HTML 标记,构建 DOM 树 遇见 style/link 标记调用相应解析器处理CSS标记,并构建出CSS样式树 遇见 sc ...
- [kafka]常见术语
前言 kafka属于分布式的消息引擎系统,主要功能是提供一套完备的消息发布与订阅解决方案. 消息和批次 kafka 的数据单元被称为消息.消息由字节数组组成,对kafka来说,消息里的数据没有特殊的格 ...
- 用python用户注册和短信验证码逻辑实现案例
一.写代码前分析(逻辑分析OK了才可以顺利成章的敲代码): A.用户发送请求 1.注册账号(用户名不能重复)--按照需求进行判断 2.短信验证码(有效期5分钟)--对短信验证码进行保存 B.用户注册. ...
- JS逆向实战21——某查查webpack密码加密
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 网站 aHR0cHM6Ly ...
- TCP 粘包
TCP(Transmission Control Protocol,传输控制协议)是一种传输层协议. TCP提供了以下主要功能: 可靠性:TCP使用确认.重传和校验等机制来确保数据的可靠传输.它能够检 ...
- jQuery Ajax执行顺序问题
代码如下: $(document).ready(function () { var res; $.ajax({ type: 'post', url: 'GridDemo.aspx/PlaceOrder ...
- SICTF-2023 #Round2-WP-Crypto | Misc
Crypto 一.[签到]古典大杂烩 附件信息: 很明显可以看出来是base100,密码工具箱一把梭: SICTF{fe853b49-8730-462e-86f5-fc8e9789f077} 二.Ra ...
- HiAI Foundation助力端侧音视频AI能力,高性能低功耗释放云侧成本
过去三年是端侧AI高速发展的几年,华为在2020年预言了端侧AI的发展潮流,2021年通过提供端云协同的方式使我们的HiAI Foundation应用性更进一个台阶,2022年提供视频超分端到端的解决 ...
- Python脚本批量造数据、跑定时任务协助测试
批量造数据 连接Mysql的信息 1 import pymysql 2 # 数据库连接信息 3 # 多个库要有多个conn 4 conn = pymysql.connect( 5 host=" ...