日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時(shí)間:2023/12/3 数据库 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用Hibernate将PostgreSQL枚举映射到JPA实体属性 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

介紹

開源的hibernate-types項(xiàng)目允許您映射JSON,ARRAY, YearMonth , Month或數(shù)據(jù)庫特定的列(例如INET地址)。

在本文中,我們將看到使用JPA和Hibernate時(shí)如何將PostgreSQL Enum類型映射到Java數(shù)組。

Maven依賴

首先,您需要在項(xiàng)目pom.xml配置文件中設(shè)置以下Maven依賴項(xiàng):

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

如果您使用的是較早版本的Hibernate,請(qǐng)查看hibernate-types GitHub存儲(chǔ)庫 ,以獲取有關(guān)當(dāng)前Hibernate版本的匹配依賴項(xiàng)的更多信息。

領(lǐng)域模型

假設(shè)我們?cè)跀?shù)據(jù)庫模式中具有以下sensor_state PostgreSQL枚舉:

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

我們的應(yīng)用程序需要將事件存儲(chǔ)在以下數(shù)據(jù)庫表中:

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

請(qǐng)注意, sensor_names , sensor_values和sensor_states列存儲(chǔ)為數(shù)組。 要將PostgreSQL數(shù)組列類型映射到Java數(shù)組,您需要一個(gè)自定義的Hibernate類型,因?yàn)閮?nèi)置類型不支持持久化特定于數(shù)據(jù)庫的數(shù)組。

但是,由于有了hibernate-types庫,您可以輕松地將event表映射到以下Event實(shí)體:

@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實(shí)體使用的Fluent風(fēng)格的API。 盡管JPA在定義設(shè)置器方面更為嚴(yán)格,但是Hibernate允許您定義設(shè)置器,以便您可以使用Fluent風(fēng)格的API來構(gòu)建實(shí)體。 有關(guān)更多詳細(xì)信息,請(qǐng)查看本文 。

@TypeDef批注用于定義Java數(shù)組類類型及其關(guān)聯(lián)的Hibernate類型之間的映射:

  • Java String[]數(shù)組類型由StringArrayType處理。
  • Java int[]數(shù)組類型由IntArrayType處理
  • Java SensorState[]由EnumArrayType處理。 EnumArrayType.SQL_ARRAY_TYPE參數(shù)用于描述用于存儲(chǔ)Enum的特定于數(shù)據(jù)庫的列類型。

SensorState Java枚舉映射如下:

public enum SensorState {ONLINE, OFFLINE, UNKNOWN; }

測試時(shí)間

現(xiàn)在,當(dāng)存儲(chǔ)以下Event實(shí)體時(shí):

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執(zhí)行以下SQL INSERT語句:

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

并且,當(dāng)我們獲取Event實(shí)體時(shí),我們可以看到所有屬性均已正確獲取

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() );

酷吧?

如果您喜歡這篇文章,我敢打賭您也會(huì)喜歡我的視頻課程

結(jié)論

hibernate-types項(xiàng)目不只支持ARRAY類型。 您可以映射PostgreSQL特定的Enums,可為空的Character ,JSON,甚至提供您自己的不可變的Hibernate自定義Types 。

有關(guān)hibernate-types項(xiàng)目的更多詳細(xì)信息,請(qǐng)參閱本文 。

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

總結(jié)

以上是生活随笔為你收集整理的如何使用Hibernate将PostgreSQL枚举映射到JPA实体属性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。