postgresql

介绍

开源的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()
);

酷吧?

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

结论

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实体属性相关推荐

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

    介绍 开源的hibernate-types项目允许您映射JSON,ARRAY, YearMonth , Month或数据库特定的列(例如INET地址). 在本文中,我们将看到使用JPA和Hiberna ...

  2. 将Hibernate中的枚举转换为自定义数值

    问题 在编码过程中,经常会遇到用某个数值来表示某种状态.类型或者阶段的情况,比如有这样一个枚举: public enum ComputerState {OPEN(10), //开启CLOSE(11), ...

  3. 【Hibernate步步为营】--关联映射之多对一

    上篇文章讨论了Hibernate的基本映射,一个实体类对应着一张表,在相应的Hibernate Mapping文件中使用<class>标签映射.并且实体类中的普通属性对应着表字段,使用&l ...

  4. 用MyEclipse自动生成hibernate映射文件和实体类

    创建web工程,使用Hibernate的时候,在工程里一个一个创建实体类太麻烦,浪费时间,现在教大家如何用MyEclipse自动生成Hibernate映射文件及实体类 方法/步骤 1 创建数据库,创建 ...

  5. Hibernate之对象关系映射

    一.一对多关联关系 1.单向n-1 单向n-1关联只需从n的一端可以访问1的一端 Hibernate使用<many-to-one>元素来映射多对一关联关系 <!-- 映射多对一的关联 ...

  6. Hibernate之对象关系映射文件

    一.对象关系映射文件 POJO类和关系数据库之间的映射可以用一个XML文档来定义 在运行时Hibernate将根据这个映射文件来生成各种SQL语句 映射文件的拓展名为 .hbm.xml 1.映射文件说 ...

  7. 使用枚举映射_用EnumMaps映射枚举键

    使用枚举映射 这是一种在JDK中存在很长时间的类型,当我们要定义以枚举类型作为键的映射时,这种类型会派上用场: EnumMap是一种特殊的Map . 我们将为给定的枚举创建一个映射: public e ...

  8. Hibernate读书笔记---继承映射

    对于面向对象的程序设计语言,继承.多态是两个最基本的概念.Hibernate的继承映射可以理解两个持久化类之间的继承关系. Hibernate支持几种继承映射策略,不管哪种继承映射策略,Hiberna ...

  9. hibernate中一对一关系映射

    这篇文章讲述的是hibernate中一对一关系映射,如有错误或者不当之处还望各位大神批评指正. 一对一映射(外键关联) 目标 假设一个人对应养一只狗,一只狗只能由一个人来养,完成一对一相关操作. 类编 ...

最新文章

  1. 离散信号与系统分析(上)
  2. json和对象、list互转
  3. ARM LCD简单绘图API
  4. C++设计模式详解之模板模式解析
  5. linux下weblogic12c建域,三、WebLogic 12C集群部署-创建域
  6. 面经 |算法工程师面试题汇总分享
  7. 【前端学习笔记】2015-09-02~~~~ 关于filter()匹配的使用
  8. 小程序对实体行业转型有何影响?
  9. 全军出击 iOS和Android,绝地求生全军出击安卓和ios能一起玩吗_绝地求生全军出击安卓ios数据互通吗_玩游戏网...
  10. TCP/IP,Linux下多进程编程,进程复制函数fork,双返回值函数,通过父进程复制一份代码相同的子进程,父子进程执行顺序由调度算法决定,代码中获取进程执行用户的函数,数据共享状态
  11. 供水管道泄漏检测用水听器侦听系统的原因
  12. React实战之React+Redux实现一个天气预报小项目
  13. 逍遥天龙八部服务器技能修改,泣诉天龙八部3逍遥三大难 技能修改势在必行
  14. nyoj54小明的存钱计划
  15. 品牌公寓+电子合同,开拓年轻人租房市场
  16. gettimeofday() 和 clock_gettime()函数 分析小结
  17. 区块链学习2-合约开发
  18. Eclypse-Z7 + Zmod ADC 1410 基础环境搭建(SDK部分)
  19. 终身 服务器_阿里云VS腾讯云618年中活动云服务器价格对比哪个更优惠?
  20. 深入学习Gremlin(5):查询路径path

热门文章

  1. 后赛门铁克时代Veritas加强数据保护应对欧盟法规
  2. 关于js中的时间处理
  3. JAVA多线程机制之死锁
  4. 数据库课本SQL第三章答案
  5. Linux下tomcat安装及优化
  6. 数据库 sql 语句优化
  7. linux journalctl 命令 查询systemd init 系统日志
  8. linux 内核模块 警告 initialization from incompatible pointer type 解决方法
  9. python TypeError: not all arguments converted during string formatting 解决
  10. Nmap源码分析(基本框架)