介绍

开源的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

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

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

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

  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. android studio 一直在 svn performing vcs refresh
  2. Iphone控件大全
  3. nowcoder OI 周赛 最后的晚餐(dinner) 解题报告
  4. minicom/picocom/cutecom/putty 安装与使用教程
  5. php 串行化数据,PHP中的串行化变量和序列化对象
  6. 机器学习实战(十三)推荐系统(协同过滤 Collaborative Filtering)
  7. 服务器维护 文档,ERP系统维护服务器维护管理文档.docx
  8. R语言︱list用法、批量读取、写出数据时的用法
  9. Entity Framework Fluent API
  10. Spark修炼之道(高级篇)——Spark源码阅读:第八节 Task执行
  11. 计算机软件毕业论文教师指导记录,【毕业论文指导教师指导记录】论文指导记录16篇...
  12. 旋转式光电编码器的设计动向
  13. swagger的基本使用
  14. 微服务下蓝绿发布、滚动发布、灰度发布等方案
  15. 【格蕾读C++ Primer Plus】第九章 内存模型和名称空间
  16. c++ 学生类和教师类的设计
  17. LAPACK使用中出现问题的解决方案(VS平台下的)
  18. H3C设备忘记密码修改办法
  19. 再上一发逻辑炸弹,不一样哦
  20. 汇川plc可以用C语言吗,汇川小型PLC梯形图编程系列教程(七):数值存储与二进制数据知识详解...

热门文章

  1. 【模拟】交换(jzoj 1518)
  2. [XSY3320] string (AC自动机,哈希,点分治)
  3. 动态规划训练10 [Coloring Brackets CodeForces - 149D]
  4. 2、安装和连接mysql
  5. SpringCloud Greenwich(三)注册中心之zookeeper、Zuul和 gateway网关配置
  6. 史上最全MySQL 大表优化方案(长文)
  7. 什么是AES算法?(整合版)
  8. 服务器windows系统如何登陆,如何登陆windows云服务器
  9. 面试项目 java-服务端 18h58
  10. 磁珠 符号_贴片磁珠功能_贴片磁珠应用