Wenn Sie interessiert sind, finden Sie hier einige Codeausschnitte, mit denen Sie den benutzerdefinierten Benutzertyp für den Ruhezustand einrichten können. Erweitern Sie zuerst den PostgreSQL-Dialekt, um ihn über den json-Typ zu informieren, dank Craig Ringer für den JAVA_OBJECT-Zeiger:
import org.hibernate.dialect.PostgreSQL9Dialect;
import java.sql.Types;
public class JsonPostgreSQLDialect extends PostgreSQL9Dialect {
public JsonPostgreSQLDialect() {
super();
this.registerColumnType(Types.JAVA_OBJECT, "json");
}
}
Als nächstes implementieren Sie org.hibernate.usertype.UserType. Die folgende Implementierung ordnet String-Werte dem json-Datenbanktyp zu und umgekehrt. Denken Sie daran, dass Strings in Java unveränderlich sind. Eine komplexere Implementierung könnte verwendet werden, um benutzerdefinierte Java-Beans auch JSON zuzuordnen, das in der Datenbank gespeichert ist.
package foo;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.usertype.UserType;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
public class StringJsonUserType implements UserType {
@Override
public int[] sqlTypes() {
return new int[] { Types.JAVA_OBJECT};
}
@Override
public Class returnedClass() {
return String.class;
}
@Override
public boolean equals(Object x, Object y) throws HibernateException {
if( x== null){
return y== null;
}
return x.equals( y);
}
@Override
public int hashCode(Object x) throws HibernateException {
return x.hashCode();
}
@Override
public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {
if(rs.getString(names[0]) == null){
return null;
}
return rs.getString(names[0]);
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {
if (value == null) {
st.setNull(index, Types.OTHER);
return;
}
st.setObject(index, value, Types.OTHER);
}
@Override
public Object deepCopy(Object value) throws HibernateException {
return value;
}
@Override
public boolean isMutable() {
return true;
}
@Override
public Serializable disassemble(Object value) throws HibernateException {
return (String)this.deepCopy( value);
}
@Override
public Object assemble(Serializable cached, Object owner) throws HibernateException {
return this.deepCopy( cached);
}
@Override
public Object replace(Object original, Object target, Object owner) throws HibernateException {
return original;
}
}
Jetzt müssen nur noch die Entitäten mit Anmerkungen versehen werden. Fügen Sie so etwas in die Klassendeklaration der Entität ein:
@TypeDefs( {@TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)})
Kommentieren Sie dann die Eigenschaft:
@Type(type = "StringJsonObject")
public String getBar() {
return bar;
}
Hibernate kümmert sich darum, die Spalte mit dem Typ json für Sie zu erstellen, und übernimmt die Zuordnung hin und her. Fügen Sie der Benutzertypimplementierung zusätzliche Bibliotheken für eine erweiterte Zuordnung hinzu.
Hier ist ein kurzes Beispiel für ein GitHub-Projekt, wenn jemand damit herumspielen möchte:
https://github.com/timfulmer/hibernate-postgres-jsontype