Created
June 27, 2018 23:21
-
-
Save DickyT/b94b0079cea89c987c883aa0ff4aa700 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.kmirai.kis.lib | |
import com.kmirai.kis.Gson | |
import org.hibernate.HibernateException | |
import org.hibernate.dialect.PostgreSQL95Dialect | |
import org.hibernate.engine.spi.SharedSessionContractImplementor | |
import org.hibernate.usertype.UserType | |
import org.springframework.util.ObjectUtils | |
import java.io.Serializable | |
import java.sql.PreparedStatement | |
import java.sql.ResultSet | |
import java.sql.Types | |
class PostgreSQLWithGson : PostgreSQL95Dialect() { | |
init { | |
this.registerColumnType(Types.JAVA_OBJECT, "jsonb") | |
} | |
} | |
class JsonbAsGsonType : UserType { | |
override fun hashCode(x: Any?) = x?.hashCode() ?: 0 | |
override fun deepCopy(value: Any?): Any { | |
if (value != null) { | |
return Gson.sharedInstance.fromJson(Gson.sharedInstance.toJson(value), value.javaClass) | |
} else { | |
throw HibernateException("ERROR: Can not deep copy null") | |
} | |
} | |
override fun replace(original: Any?, target: Any?, owner: Any?) = deepCopy(original) | |
override fun equals(x: Any?, y: Any?) = ObjectUtils.nullSafeEquals(x, y) | |
override fun returnedClass(): Class<*> = Any::class.java | |
override fun assemble(cached: Serializable?, owner: Any?) = deepCopy(cached) | |
override fun disassemble(value: Any?) = deepCopy(value) as? Serializable ?: "" | |
override fun nullSafeSet(st: PreparedStatement?, value: Any?, index: Int, session: SharedSessionContractImplementor?) { | |
if (value == null) { | |
st!!.setObject(index, "{}", Types.OTHER) | |
} else { | |
st!!.setObject(index, Gson.sharedInstance.toJson(value), Types.OTHER) | |
} | |
} | |
override fun nullSafeGet(rs: ResultSet?, names: Array<out String>?, session: SharedSessionContractImplementor?, owner: Any?): Any { | |
val rawData = rs!!.getString(names!![0]) | |
if (owner != null) { | |
return Gson.sharedInstance.fromJson(rawData, owner.javaClass.getDeclaredField("data").type) | |
} else { | |
throw HibernateException("ERROR: Owner container is null") | |
} | |
} | |
override fun isMutable() = true | |
override fun sqlTypes() = intArrayOf(Types.JAVA_OBJECT) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This custom
JPA
type convertor can automatically parse or stringify yourjsonb
data withGson
. Note that in line52
, you muse use a fixed field name of thejsonb
field, or you must figure out how to get thejsonb
field in JPA ORM model.