यदि आप रुचि रखते हैं, तो यहां हाइबरनेट कस्टम उपयोगकर्ता प्रकार प्राप्त करने के लिए कुछ कोड स्निपेट हैं। JSONA_OBJECT पॉइंटर के लिए क्रेग रिंगर को धन्यवाद देने के लिए सबसे पहले PostgreSQL बोली का विस्तार करके इसे json प्रकार के बारे में बताएं।
import org.hibernate.dialect.PostgreSQL9Dialect;
import java.sql.Types;
public class JsonPostgreSQLDialect extends PostgreSQL9Dialect {
public JsonPostgreSQLDialect() {
super();
this.registerColumnType(Types.JAVA_OBJECT, "json");
}
}
अगला org.hibernate.usertype.UserType लागू करें। नीचे दिए गए कार्यान्वयन, नक्शे को स्ट्रिंग मानों को json डेटाबेस प्रकार, और इसके विपरीत। याद रखें स्ट्रिंग्स जावा में अपरिवर्तनीय हैं। एक अधिक जटिल कार्यान्वयन का उपयोग कस्टम जावा बीन्स को JSON में मैप करने के लिए किया जा सकता है और साथ ही डेटाबेस में भी किया जा सकता है।
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;
}
}
अब जो कुछ बचा है, वह एंटिटी को एनोटेट कर रहा है। इकाई की घोषणा पर इस तरह से कुछ डालें:
@TypeDefs( {@TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)})
फिर संपत्ति को एनोटेट करें:
@Type(type = "StringJsonObject")
public String getBar() {
return bar;
}
हाइबरनेट आपके लिए json प्रकार के साथ कॉलम बनाने का ख्याल रखेगा, और मैपिंग को आगे-पीछे करेगा। अधिक उन्नत मैपिंग के लिए उपयोगकर्ता प्रकार कार्यान्वयन में अतिरिक्त पुस्तकालयों को इंजेक्ट करें।
यहाँ एक त्वरित नमूना GitHub परियोजना है अगर कोई इसके साथ खेलना चाहता है:
https://github.com/timfulmer/hibernate-postgres-jsontype