Rohit Bajaj
asked on
what are @Type and @Parameter in Hibernate
Hi,
I have the following piece of code :
@Column
@Type(type = "com.JSONUType", parameters =
{@Parameter(name = "classType", value = "com.ContactInfo")})
private ContactInfo initiator;
And this info is getting stored in the form {"type" : "ALL"} in the mysql table.
The contactinfo is like :
And JsonUType is fairly complex :
What exactly is this doing ? Is there any way to simplify this ?
I want to understand the meaning of bold parts.
I have the following piece of code :
@Column
@Type(type = "com.JSONUType", parameters =
{@Parameter(name = "classType", value = "com.ContactInfo")})
private ContactInfo initiator;
And this info is getting stored in the form {"type" : "ALL"} in the mysql table.
The contactinfo is like :
[b]@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE,
setterVisibility = JsonAutoDetect.Visibility.NONE)
@JsonInclude(JsonInclude.Include.NON_NULL)[/b]
public class ContactInfo implements Serializable {
public enum Type {
NOT_SET,
ALL,
ASK_INITIATOR,
CHANNEL,
USERS_LIST,
USER
}
And JsonUType is fairly complex :
public class JSONUType implements UserType, ParameterizedType, Serializable {
private static final long serialVersionUID = 1L;
private static final ObjectMapper MAPPER = new ObjectMapper();
private static final String CLASS_TYPE = "classType";
private static final String TYPE = "type";
private static final int[] SQL_TYPES = new int[] { Types.LONGVARCHAR, Types.CLOB, Types.BLOB };
private Class<?> classType;
private int sqlType = Types.LONGVARCHAR; // before any guessing
@Override
public void setParameterValues(Properties params) {
String classTypeName = params.getProperty(CLASS_TYPE);
try {
this.classType = ReflectHelper.classForName(classTypeName, this.getClass());
} catch (ClassNotFoundException cnfe) {
throw new HibernateException("classType not found", cnfe);
}
String type = params.getProperty(TYPE);
if (type != null) {
this.sqlType = Integer.decode(type);
}
}
@Override
public Object assemble(Serializable cached, Object owner) throws HibernateException {
return this.deepCopy(cached);
}
@Override
public Object deepCopy(Object value) throws HibernateException {
if (value != null) {
try {
return MAPPER.readValue(MAPPER.writeValueAsString(value), this.classType);
} catch (IOException e) {
throw new HibernateException("unable to deep copy object", e);
}
}
return null;
}
@Override
public Serializable disassemble(Object value) throws HibernateException {
try {
return MAPPER.writeValueAsString(value);
} catch (JsonProcessingException e) {
throw new HibernateException("unable to disassemble object", e);
}
}
@Override
public boolean equals(Object x, Object y) throws HibernateException {
return Objects.equal(x, y);
}
@Override
public int hashCode(Object x) throws HibernateException {
return Objects.hashCode(x);
}
@Override
public boolean isMutable() {
return true;
}
@Override
public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException,
SQLException {
Object obj = null;
if (!rs.wasNull()) {
if (this.sqlType == Types.CLOB || this.sqlType == Types.BLOB) {
byte[] bytes = rs.getBytes(names[0]);
if (bytes != null) {
try {
obj = MAPPER.readValue(bytes, this.classType);
} catch (IOException e) {
throw new HibernateException("unable to read object from result set", e);
}
}
} else {
try {
String content = rs.getString(names[0]);
if (content != null) {
obj = MAPPER.readValue(content, this.classType);
}
} catch (IOException e) {
throw new HibernateException("unable to read object from result set", e);
}
}
}
return obj;
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException,
SQLException {
if (value == null) {
st.setNull(index, this.sqlType);
} else {
if (this.sqlType == Types.CLOB || this.sqlType == Types.BLOB) {
try {
st.setBytes(index, MAPPER.writeValueAsBytes(value));
} catch (JsonProcessingException e) {
throw new HibernateException("unable to set object to result set", e);
}
} else {
try {
st.setString(index, MAPPER.writeValueAsString(value));
} catch (JsonProcessingException e) {
throw new HibernateException("unable to set object to result set", e);
}
}
}
}
@Override
public Object replace(Object original, Object target, Object owner) throws HibernateException {
return this.deepCopy(original);
}
@Override
public Class<?> returnedClass() {
return this.classType;
}
@Override
public int[] sqlTypes() {
//Using varchar as default type for now
return new int[] { Types.LONGVARCHAR };
}
}
What exactly is this doing ? Is there any way to simplify this ?
I want to understand the meaning of bold parts.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.