如何使用Hibernate将PostgreSQL枚举映射到JPA实体属性
介紹
開源的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
總結
以上是生活随笔為你收集整理的如何使用Hibernate将PostgreSQL枚举映射到JPA实体属性的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 退役士兵备案(退役后备案)
 - 下一篇: jersey客户端_项目学生:带有Jer