如何使用Hibernate将PostgreSQL枚举映射到JPA实体属性

介绍

开源的hibernate-types项目允许您映射JSON,ARRAY, YearMonthMonth或数据库特定的列(例如INET地址)。

在本文中,我们将看到使用JPA和Hibernate时如何将PostgreSQL Enum类型映射到Java数组。

Maven依赖

首先,您需要在项目pom.xml配置文件中设置以下Maven依赖项:

<dependency><groupId>com.vladmihalcea</groupId><artifactId>hibernate-types-52</artifactId><version>2.3.5</version>
</dependency>

如果您使用的是较早版本的Hibernate,请查看hibernate-types GitHub存储库 ,以获取有关当前Hibernate版本的匹配依赖项的更多信息。

领域模型

假设我们在数据库模式中具有以下sensor_state PostgreSQL枚举:

CREATE TYPE sensor_state AS ENUM ('ONLINE','OFFLINE','UNKNOWN'
);

我们的应用程序需要将事件存储在以下数据库表中:

CREATE TABLE event (id bigint NOT NULL,sensor_names text[],sensor_values integer[],sensor_states sensor_state[],CONSTRAINT event_pkey PRIMARY KEY (id)
)

请注意, sensor_namessensor_valuessensor_states列存储为数组。 要将PostgreSQL数组列类型映射到Java数组,您需要一个自定义的Hibernate类型,因为内置类型不支持持久化特定于数据库的数组。

但是,由于有了hibernate-types库,您可以轻松地将event表映射到以下Event实体:

@Entity(name = "Event")
@Table(name = "event")
@TypeDefs({@TypeDef(typeClass = StringArrayType.class,defaultForType = String[].class),@TypeDef(typeClass = IntArrayType.class,defaultForType = int[].class),@TypeDef(typeClass = EnumArrayType.class,defaultForType = SensorState[].class,parameters = {@Parameter(name = EnumArrayType.SQL_ARRAY_TYPE,value = "sensor_state")})
})
public class Event {@Idprivate Long id;@Column(name = "sensor_names",columnDefinition = "text[]")private String[] sensorNames;@Column(name = "sensor_values",columnDefinition = "integer[]")private int[] sensorValues;@Column(name = "sensor_states",columnDefinition = "sensor_state[]")private SensorState[] sensorStates;public Long getId() {return id;}public Event setId(Long id) {this.id = id;return this;}public String[] getSensorNames() {return sensorNames;}public Event setSensorNames(String[] sensorNames) {this.sensorNames = sensorNames;return this;}public int[] getSensorValues() {return sensorValues;}public Event setSensorValues(int[] sensorValues) {this.sensorValues = sensorValues;return this;}public SensorState[] getSensorStates() {return sensorStates;}public Event setSensorStates(SensorState[] sensorStates) {this.sensorStates = sensorStates;return this;}
}

注意Event实体使用的Fluent风格的API。 尽管JPA在定义设置器方面更为严格,但是Hibernate允许您定义设置器,以便您可以使用Fluent风格的API来构建实体。 有关更多详细信息,请查看本文 。

@TypeDef批注用于定义Java数组类类型及其关联的Hibernate类型之间的映射:

  • Java String[]数组类型由StringArrayType处理。
  • Java int[]数组类型由IntArrayType处理
  • Java SensorState[]EnumArrayType处理。 EnumArrayType.SQL_ARRAY_TYPE参数用于描述用于存储Enum的特定于数据库的列类型。

SensorState Java枚举映射如下:

public enum SensorState {ONLINE, OFFLINE, UNKNOWN;
}

测试时间

现在,当存储以下Event实体时:

entityManager.persist(new Event().setId(1L).setSensorNames(new String[]{"Temperature", "Pressure"}).setSensorValues(new int[]{12, 756}).setSensorStates(new SensorState[]{SensorState.ONLINE, SensorState.OFFLINE,SensorState.ONLINE,     SensorState.UNKNOWN})   
);

Hibernate执行以下SQL INSERT语句:

Query:["insert into event (sensor_names, sensor_states, sensor_values, id) values (?, ?, ?, ?)
"], 
Params:[({"Temperature","Pressure"}, {"ONLINE","OFFLINE","ONLINE","UNKNOWN"}, {"12","756"}, 1
)]

并且,当我们获取Event实体时,我们可以看到所有属性均已正确获取

Event event = entityManager.find(Event.class, 1L);assertArrayEquals(new String[]{"Temperature", "Pressure"}, event.getSensorNames()
);assertArrayEquals(new int[]{12, 756}, event.getSensorValues()
);assertArrayEquals(new SensorState[]{SensorState.ONLINE, SensorState.OFFLINE, SensorState.ONLINE, SensorState.UNKNOWN}, event.getSensorStates()
);

酷吧?

如果您喜欢这篇文章,我敢打赌您也会喜欢我的视频课程

映射PostgreSQL枚举

映射PostgreSQL枚举

结论

hibernate-types项目不只支持ARRAY类型。 您可以映射PostgreSQL特定的Enums,可为空的Character ,JSON,甚至提供您自己的不可变的Hibernate自定义Types

有关hibernate-types项目的更多详细信息,请参阅本文 。

翻译自: https://www.javacodegeeks.com/2018/12/map-postgresql-jpa-entity-hibernate.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】广东开放大学 物权法 形成性考核 (43)

选择题 题目&#xff1a;下列哪一选项不是民法上的物?&#xff08;&#xff09; 题目&#xff1a;甲有一套别墅&#xff0c;甲的下列何种行为不能体现物权的性质&#xff08;&#xff09; 题目&#xff1a;根据物权是否具有独立性不同&#xff0c;物权可以分为&#xff08;&am…

蓝桥杯基础模块2:蜂鸣器继电器

一、模块题目 二、原理简述 1、74HC138(参见模块1) 2、74HC02(参见模块1) 3、74HC573(参见模块1)

【渝粤教育】广东开放大学 管理会计 形成性考核 (33)

选择题 题目&#xff1a;固定成本和变动成本是根据成本按其( )分类的 答案&#xff1a;看左侧 题目&#xff1a;下列成本项目中&#xff0c; 属于变动成本的是 答案&#xff1a;看左侧 题目&#xff1a;企业某产品本月消耗各项费用如下:直接材料50000元&#xff0c;直接人工200…

蓝桥杯基础模块3_1:数码管静态显示

一、模块题目 二、原理简述 1、数码管 CT107D单片机综合实训平台上使用的数码管是F3461BH(倒数第二个字母是A则共阴,是B则共阳)。 F3461BH是一个4位8段的数码管,其中a、b、c、d、e、f、g、dp引脚分别对应8个段码,该8个引脚通过74HC573锁存器与单片机的P0端口相连。另外有…

【渝粤教育】广东开放大学 计算机导论 形成性考核 (51)

选择题 题目&#xff1a;Excel 2003所属的套装软件是______。 题目&#xff1a;下面说法正确的是&#xff08; &#xff09; 选择一项&#xff1a; a. 数据是加工之前的信息 b. 信息是数据加工的结果 c. 数据就是数字 d. 数据就是信息 题目&#xff1a;用流程图描述算法形象、直…

【渝粤教育】广东开放大学财务会计2 形成性考核 (34)

选择题 题目&#xff1a; 下列属于其他业务收入的是&#xff08;  &#xff09;。 选择一项&#xff1a; 答案&#xff1a;看左侧 题目&#xff1a; 下列各项中&#xff0c;应计入管理费用的是&#xff08;  &#xff09;。 选择一项&#xff1a; 答案&#xff1a;看左侧…

jersey客户端_项目学生:带有Jersey的Web服务客户端

jersey客户端这是Project Student的一部分。 其他职位包括带有Jersey的Webservice Client&#xff0c; 带有Spring Data的 业务层和持久性 。 RESTful Web应用程序洋葱的第一层是Web服务客户端。 它可以用于模仿包含AJAX内容的网页&#xff0c;也可以被webapp的编程用户用来模…

蓝桥杯基础模块3_2:数码管动态显示

一、模块题目 二、原理简述 动态显示的基本原理与实现思路(转载) 动态显示实质上就是轮流点亮单个数码管实现多位数码管整体显示的效果。在轮流显示过程中,每位数码管点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但…

【渝粤教育】电大中专中医基础知识 (2)作业 题库

1.下列表述中属于证的是 A.头痛 B.麻疹 C.风寒犯肺 D.恶寒 E.水痘 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;C 2.下列表述中属于症的是 A.水肿 B.消渴 C.咳嗽 D.肺痈 E.恶寒 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;未作答 3.“阳损及阴,阴损及…

Java:使用Toxiproxy模拟各种连接问题

用Toxiproxy和Java的HttpURLConnection模拟各种连接问题&#xff0c;以查看产生了什么样的错误&#xff1a;连接超时vs.读取超时vs.连接被拒绝…。 结果&#xff1a; 系统&#xff1a;openjdk 11.0.1 2018-10-16 (.setConnectTimeout 1) > java.net.SocketTimeoutExceptio…

蓝桥杯基础模块4_1:独立按键

一、模块题目 二、原理简述 1、独立按键的处理思路(转载) 一般情况下,独立按键有两个引脚,其中一个通过上拉电阻接到单片机的I/O端口,另外一端接地。也就是说,平时按键没有动作的时候,输出的是高电平,如果有按下动作发生,则输出的是低电平。那么,我们在程序设计的时…

【渝粤教育】广东开放大学 行政管理 形成性考核 (35)

选择题 题目&#xff1a; ( )是从行政过程的角度来看待行政职能的 选择一项&#xff1a; 答案&#xff1a;看左侧 题目&#xff1a; 经过1993年的机构改革&#xff0c;国务院机构减少到59个&#xff0c;其中部委40个&#xff0c;直属机构13个&#xff0c;办事机构5个和1个办公…

【渝粤教育】广东开放大学 Photoshop 图像处理 形成性考核 (24)

选择题 题目&#xff1a; 使用变换命令中的缩放命令时&#xff0c;按住哪个键可以保证等比例缩放&#xff1f;&#xff08; &#xff09; 答案&#xff1a;看左侧 题目&#xff1a; 将前景色和背景色恢复为默认颜色的快捷键是&#xff08;&#xff09;&#xff1f; 答案&#…

【渝粤教育】广东开放大学 个人与团队管理 形成性考核 (57)

选择题 题目&#xff1a;按照KOLB学习周期&#xff0c;一个完整的学习过程包含四个阶段&#xff0c;不属于这四个阶段的是&#xff08;&#xff09;。 答案&#xff1a;看左侧 题目&#xff1a; 小米的新工作需要录入大量文件&#xff0c;可他对打字不是很在行。他给自己制定了…

junit动态忽略测试_有条件忽略测试的JUnit规则

junit动态忽略测试我一直认为使用Ignore停用测试是一个坏主意。 例外&#xff0c;这可能是一种将间歇性失败的测试放入隔离区以供以后处理的方法&#xff08;如Martin Fowler 在此处所述 &#xff09;。 随着越来越多的测试不断被忽略和遗忘&#xff0c;这带来了测试套件衰减的…

【渝粤教育】广东开放大学 企业标准化 形成性考核 (49)

选择题 题目&#xff1a; 对接受评价部门/单位标准化子体系的建立和实施不能采用随机抽查样本的方式进行评价。 选择一项&#xff1a; 答案&#xff1a;看左侧 题目&#xff1a; 现场确认一般是采用随机抽查&#xff0c;填写记录表和评分表&#xff0c;并通过确认人员的______…

蓝桥杯基础模块4_3:矩阵按键

一、模块题目 二、原理简述 1、矩阵键盘的扫描思想(转载+删减) 与独立按键不同的是,按键的两个引脚都分别连接的单片机的I/O端口,一个作为行信号,另外一个作为列信号。下以4X4的矩阵键盘为例,探讨其工作方式和扫描思路。 要识别出黄色按键的按下状态,逐行扫描,然后读…

【渝粤教育】广东开放大学 刑法 形成性考核 (42)

选择题 题目&#xff1a;以下哪个不是我国刑法的法定原则&#xff1f; 题目&#xff1a;以下哪个管辖权是我国管辖权的基础&#xff1f; 题目&#xff1a;以下哪种情况不适用属地管辖&#xff1f; 题目&#xff1a;犯罪的最本质特征在于它是&#xff08; &#xff09;。 题目&a…

休息一下,或者:如何使用Java 12制作出色的拼图游戏

Java 12以实验形式提供了switch表达式以及switch和break语句的新形式。 对于可能很少用到的构造&#xff0c;有大量新语法和语义&#xff0c;当然&#xff0c;对于那些困惑者和认证考试问题的作者来说&#xff0c;这是一件了不起的礼物。 如果您喜欢Java难题&#xff0c;并且可…