postgresql_如何使用Hibernate将PostgreSQL枚举映射到JPA实体属性
postgresql
介绍
开源的hibernate-types
项目允许您映射JSON,ARRAY, YearMonth
, Month
或特定于数据库的列(例如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_names
, sensor_values
和sensor_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()
);
酷吧?
如果您喜欢这篇文章,我敢打赌您也会喜欢我的书和视频课程。
结论
hibernate-types
项目不只支持ARRAY类型。 您可以映射PostgreSQL特定的Enums,可为空的Character
,JSON,甚至提供自己的不可变Hibernate自定义Types
。
有关hibernate-types
项目的更多详细信息,请参阅本文。
翻译自: https://www.javacodegeeks.com/2018/12/map-postgresql-jpa-entity-hibernate.html
postgresql
postgresql_如何使用Hibernate将PostgreSQL枚举映射到JPA实体属性相关推荐
- 如何使用Hibernate将PostgreSQL枚举映射到JPA实体属性
介绍 开源的hibernate-types项目允许您映射JSON,ARRAY, YearMonth , Month或数据库特定的列(例如INET地址). 在本文中,我们将看到使用JPA和Hiberna ...
- 将Hibernate中的枚举转换为自定义数值
问题 在编码过程中,经常会遇到用某个数值来表示某种状态.类型或者阶段的情况,比如有这样一个枚举: public enum ComputerState {OPEN(10), //开启CLOSE(11), ...
- 【Hibernate步步为营】--关联映射之多对一
上篇文章讨论了Hibernate的基本映射,一个实体类对应着一张表,在相应的Hibernate Mapping文件中使用<class>标签映射.并且实体类中的普通属性对应着表字段,使用&l ...
- 用MyEclipse自动生成hibernate映射文件和实体类
创建web工程,使用Hibernate的时候,在工程里一个一个创建实体类太麻烦,浪费时间,现在教大家如何用MyEclipse自动生成Hibernate映射文件及实体类 方法/步骤 1 创建数据库,创建 ...
- Hibernate之对象关系映射
一.一对多关联关系 1.单向n-1 单向n-1关联只需从n的一端可以访问1的一端 Hibernate使用<many-to-one>元素来映射多对一关联关系 <!-- 映射多对一的关联 ...
- Hibernate之对象关系映射文件
一.对象关系映射文件 POJO类和关系数据库之间的映射可以用一个XML文档来定义 在运行时Hibernate将根据这个映射文件来生成各种SQL语句 映射文件的拓展名为 .hbm.xml 1.映射文件说 ...
- 使用枚举映射_用EnumMaps映射枚举键
使用枚举映射 这是一种在JDK中存在很长时间的类型,当我们要定义以枚举类型作为键的映射时,这种类型会派上用场: EnumMap是一种特殊的Map . 我们将为给定的枚举创建一个映射: public e ...
- Hibernate读书笔记---继承映射
对于面向对象的程序设计语言,继承.多态是两个最基本的概念.Hibernate的继承映射可以理解两个持久化类之间的继承关系. Hibernate支持几种继承映射策略,不管哪种继承映射策略,Hiberna ...
- hibernate中一对一关系映射
这篇文章讲述的是hibernate中一对一关系映射,如有错误或者不当之处还望各位大神批评指正. 一对一映射(外键关联) 目标 假设一个人对应养一只狗,一只狗只能由一个人来养,完成一对一相关操作. 类编 ...
最新文章
- 离散信号与系统分析(上)
- json和对象、list互转
- ARM LCD简单绘图API
- C++设计模式详解之模板模式解析
- linux下weblogic12c建域,三、WebLogic 12C集群部署-创建域
- 面经 |算法工程师面试题汇总分享
- 【前端学习笔记】2015-09-02~~~~ 关于filter()匹配的使用
- 小程序对实体行业转型有何影响?
- 全军出击 iOS和Android,绝地求生全军出击安卓和ios能一起玩吗_绝地求生全军出击安卓ios数据互通吗_玩游戏网...
- TCP/IP,Linux下多进程编程,进程复制函数fork,双返回值函数,通过父进程复制一份代码相同的子进程,父子进程执行顺序由调度算法决定,代码中获取进程执行用户的函数,数据共享状态
- 供水管道泄漏检测用水听器侦听系统的原因
- React实战之React+Redux实现一个天气预报小项目
- 逍遥天龙八部服务器技能修改,泣诉天龙八部3逍遥三大难 技能修改势在必行
- nyoj54小明的存钱计划
- 品牌公寓+电子合同,开拓年轻人租房市场
- gettimeofday() 和 clock_gettime()函数 分析小结
- 区块链学习2-合约开发
- Eclypse-Z7 + Zmod ADC 1410 基础环境搭建(SDK部分)
- 终身 服务器_阿里云VS腾讯云618年中活动云服务器价格对比哪个更优惠?
- 深入学习Gremlin(5):查询路径path