手机自助建网站,北京市两学一做网站,wordpress外卖,购物网站的建设jpa映射json介绍 开源的hibernate-types项目允许您将Java对象或Jackson JsonNode为JPA实体属性。 最近#xff0c;由于我们的杰出贡献者#xff0c;我们添加了对类型安全集合的支持#xff0c;该集合也可以作为JSON持久化。 在本文中#xff0c;您将了解如何实现此目标。 … jpa映射json 介绍 开源的hibernate-types项目允许您将Java对象或Jackson JsonNode为JPA实体属性。 最近由于我们的杰出贡献者我们添加了对类型安全集合的支持该集合也可以作为JSON持久化。 在本文中您将了解如何实现此目标。 Maven依赖 首先您需要在项目pom.xml配置文件中设置以下Maven依赖项 dependencygroupIdcom.vladmihalcea/groupIdartifactIdhibernate-types-52/artifactIdversion${hibernate-types.version}/version
/dependency 如果您使用的是旧版本的Hibernate请查看hibernate-types GitHub存储库 以获取有关当前Hibernate版本的匹配依赖项的更多信息。 领域模型 假设我们具有以下Location Java对象类型。 public class Location implements Serializable {private String country;private String city;//Getters and setters omitted for brevityOverridepublic String toString() {return Location{ country country \ , city city \ };}
} 并且一个Event实体 Entity(name Event)
Table(name event)
public class Event extends BaseEntity {Type(type jsonb)Column(columnDefinition jsonb)private Location location;Type(type jsonb,parameters {org.hibernate.annotations.Parameter(name TypeReferenceFactory.FACTORY_CLASS,value com.vladmihalcea.hibernate.type.json.PostgreSQLGenericJsonBinaryTypeTest$AlternativeLocationsTypeReference)})Column(columnDefinition jsonb)private ListLocation alternativeLocations new ArrayListLocation();//Getters and setters omitted for brevity
} BaseEntity定义了一些基本属性例如Id Version Id Version 和几种海关Hibernate类型其中我们对JsonBinaryType感兴趣。 TypeDefs({TypeDef(name string-array, typeClass StringArrayType.class),TypeDef(name int-array, typeClass IntArrayType.class),TypeDef(name json, typeClass JsonStringType.class),TypeDef(name jsonb, typeClass JsonBinaryType.class),TypeDef(name jsonb-node, typeClass JsonNodeBinaryType.class),TypeDef(name json-node, typeClass JsonNodeStringType.class),
})
MappedSuperclass
public class BaseEntity {Idprivate Long id;Versionprivate Integer version;//Getters and setters omitted for brevity
} 有关使用MappedSuperclass更多详细信息请MappedSuperclass 本文 。 TypeReferenceFactory 要将Location对象存储在jsonb PostgreSQL列中我们只需要使用Type(type jsonb)注释location属性。 但是对于alternativeLocations集合我们需要提供关联的Jackson TypeReference以便在从关系数据库中读取JSON对象时我们可以重建非常相同的类型安全的Java集合。 为此我们提供TypeReferenceFactory实现的完全限定的类如下所示 public static class AlternativeLocationsTypeReference implements TypeReferenceFactory {Overridepublic TypeReference? newTypeReference() {return new TypeReferenceListLocation() {};}
} 而已 测试时间 保存以下Event实体时 Location cluj new Location();
cluj.setCountry(Romania);
cluj.setCity(Cluj-Napoca);Location newYork new Location();
newYork.setCountry(US);
newYork.setCity(New-York);Location london new Location();
london.setCountry(UK);
london.setCity(London);Event event new Event();
event.setId(1L);
event.setLocation(cluj);
event.setAlternativeLocations(Arrays.asList(newYork, london)
);entityManager.persist(event); Hibernate将生成以下SQL INSERT语句 INSERT INTO event (version, alternativeLocations, location, id
)
VALUES (0, [{country:US,city:New-York},{country:UK,city:London}], {country:Romania,city:Cluj-Napoca}, 1
) 此外检索回时Event实体无论是location 并the alternativeLocations属性是正确的获取 事件event entityManager.findEvent.classeventId; assertEquals(Cluj-Napoca, event.getLocation().getCity()
);assertEquals(2, event.getAlternativeLocations().size());assertEquals(New-York, event.getAlternativeLocations().get(0).getCity()
);
assertEquals(London, event.getAlternativeLocations().get(1).getCity()
); 酷吧 翻译自: https://www.javacodegeeks.com/2017/12/map-json-collections-using-jpa-hibernate.htmljpa映射json