您的位置:首页 > 编程语言 > Java开发

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.java

public 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息