spring data jpa hibernate 映射 postgres jsonb
2017-03-17 21:43
302 查看
spring boot jpa 映射postgres 的jsonb 类型
使用 jpa-hibernate 处理postgres 的jsonb类型
首先需要自定一个Dialect,然后注册到hibernate框架中自定义一个Type用于java和数据库之间的mapping
在jsonb的字段上使用自定义的类型进行映射
具体的步骤
CustomPostgreSqlDialect.javapublic class CustomPostgreSqlDialect extends PostgreSQL9Dialect { public CustomPostgreSqlDialect() { this.registerColumnType(Types.JAVA_OBJECT, "jsonb"); } }
配置文件中使用自定义的方言
spring.jpa.properties.hibernate.dialect=org.jsonb.CustomPostgreSqlDialect
自定义类型JsonDataUserType.java
public class JsonDataUserType implements UserType { @Override public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException { if (value == null) { st.setNull(index, Types.OTHER); } else { st.setObject(index, value, Types.OTHER); } } @Override public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException { PGobject o = (PGobject) rs.getObject(names[0]); if (o.getValue() != null) { return o.getValue(); } return null; } @Override public Object deepCopy(Object originalValue) throws HibernateException { if (originalValue == null) { return null; } return originalValue.toString(); } @Override public Serializable disassemble(Object value) throws HibernateException { Object copy = deepCopy(value); if (copy instanceof Serializable) { return (Serializable) copy; } throw new SerializationException(String.format("Cannot serialize '%s', %s is not Serializable.", value, value.getClass()), null); } @Override public Object assemble(Serializable cached, Object owner) throws HibernateException { return deepCopy(cached); } @Override public Object replace(Object original, Object target, Object owner) throws HibernateException { return deepCopy(original); } @Override public boolean isMutable() { return true; } @Override public int hashCode(Object x) throws HibernateException { if (x == null) { return 0; } return x.hashCode(); } @Override public boolean equals(Object x, Object y) throws HibernateException { return ObjectUtils.nullSafeEquals(x, y); } @Override public Class<?> returnedClass() { return String.class; } @Override public int[] sqlTypes() { return new int[]{Types.JAVA_OBJECT}; } }
在实体中的字段上使用自定义的类型
@Entity @Table(name = "device") @TypeDef(name = "JsonDataUserType", typeClass = JsonDataUserType.class) public class DeviceEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(name = "deviceNum") private String deviceNum; @Column(name = "jsonb") @Type(type = "JsonDataUserType") private String jsonb; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getDeviceNum() { return deviceNum; } public void setDeviceNum(String deviceNum) { this.deviceNum = deviceNum; } public String getJsonb() { return jsonb; } public void setJsonb(String jsonb) { this.jsonb = jsonb; } }
实例 pg-jsonb-jpa
相关文章推荐
- spring-data-jpa+hibernate 各种缓存的配置演示
- SpringMVC4+JPA(Hibernate4)+Spring-data-jpa+Shiro整合
- spring4.2+spring mvc +spring data+jpa+hibernate的程序构架
- spring-data-jpa+hibernate 各种缓存的配置演示
- 从最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate
- spring-data-jpa+hibernate 各种缓存的配置演示
- spring-data-jpa+hibernate 各种缓存的配置演示
- spring-data-jpa 中,如果使用了one-to-many , many-to-one的注释,会在Jackson进行json字符串化的时候出现错误
- 基于jpa/springData ,hibernate,mybtis的分页
- 【转载】spring-data-jpa+hibernate 各种缓存的配置演示
- spring+springMVC+Hibernate+spring-data-jpa 完整干净注解版的Demo
- spring data jpa + hibernate
- springmvc + spring data jpa + hibernate 配置
- 手把手教你从最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate(含源码下载)
- Dao层系列-7-Hibernate Spring Data JPA
- java框架整合例子(spring、spring mvc、spring data jpa、hibernate)
- SpringMVC +Hibernate JPA+Spring-data-jpa
- java(样品集成框架spring、spring mvc、spring data jpa、hibernate)
- Spring ORM+Hibernate?Out!换 Spring Data JPA 吧!
- Spring ORM+Hibernate?Out!换 Spring Data JPA 吧!