Hibernate 不会保存 UserType
Hibernate won't save UserType
我有一个对象(人),我正尝试使用 Hibernate 将其保存到数据库中。 Person 有一个 Hibernate UserType 对象。我无法将 Person 保存到数据库,我认为问题出在 UserType 上。
我已经记录了 Sql 以查看发生了什么,我注意到记录器跳过了 UserType 参数。这是因为值没有被发送到数据库吗?
insert into person_detail (code, person_type, person_id, name) values (?, ?, ?, ?)
22.01.15 16:16:41 TRACE [main] >> [org.hibernate.type.descriptor.sql.BasicBinder] binding parameter [1] as [VARCHAR] - J1
22.01.15 16:16:41 TRACE [main] >> [org.hibernate.type.descriptor.sql.BasicBinder] binding parameter [3] as [NUMERIC] - 99
22.01.15 16:16:41 TRACE [main] >> [org.hibernate.type.descriptor.sql.BasicBinder] binding parameter [4] as [NUMERIC] - Joe
> <typedef name='PersonType' class='com.TypedefEnumUserTyp'> <param
> name='enumClassNam'>com.PersonType</param> </typedef>
<subclass name="Person" discriminator-value="PERSON">
<join table="person_detail">
<key column="person_id" />
<property name="person_type" column="person_type" type="PersonType/>
<property name="code" column="code" />
<property name="name" column="name" />
</join>
</subclass>
public class TypedefEnumUserType extends AbstractToStringUserType implements UserType, Serializable, ParameterizedType {
private Class enumClass;
public void setParameterValues(Properties params) {
this.enumClass = classForProp("enumClassName", params);
}
public final String toString(Object value) throws HibernateException {
if (value == null) {
return null;
}
if (value instanceof Enum) {
final Enum eValue = (Enum) value;
return eValue.name();
}
else {
final String valueClass = value.getClass().getName();
throw new IllegalArgumentException("Error trying to convert value to String. Expected instance of Enum, but got " + valueClass);
}
}
@SuppressWarnings("unchecked")
public final Object fromString(String cached) throws HibernateException {
if (cached == null) {
return null;
}
try {
return Enum.valueOf(enumClass, cached);
}
catch (IllegalArgumentException iae) {
throw new SerializationException(enumClass.getName() + " value in database is invalid: " + cached, iae);
}
}
}
原来我的记录一直在保存。单元测试在保存后立即删除了我的记录,所以我认为它没有被保存。我将测试包装在一个 t运行saction 中,以便在它 运行 之后回滚。傻我。
我有一个对象(人),我正尝试使用 Hibernate 将其保存到数据库中。 Person 有一个 Hibernate UserType 对象。我无法将 Person 保存到数据库,我认为问题出在 UserType 上。
我已经记录了 Sql 以查看发生了什么,我注意到记录器跳过了 UserType 参数。这是因为值没有被发送到数据库吗?
insert into person_detail (code, person_type, person_id, name) values (?, ?, ?, ?)
22.01.15 16:16:41 TRACE [main] >> [org.hibernate.type.descriptor.sql.BasicBinder] binding parameter [1] as [VARCHAR] - J1
22.01.15 16:16:41 TRACE [main] >> [org.hibernate.type.descriptor.sql.BasicBinder] binding parameter [3] as [NUMERIC] - 99
22.01.15 16:16:41 TRACE [main] >> [org.hibernate.type.descriptor.sql.BasicBinder] binding parameter [4] as [NUMERIC] - Joe
> <typedef name='PersonType' class='com.TypedefEnumUserTyp'> <param
> name='enumClassNam'>com.PersonType</param> </typedef>
<subclass name="Person" discriminator-value="PERSON">
<join table="person_detail">
<key column="person_id" />
<property name="person_type" column="person_type" type="PersonType/>
<property name="code" column="code" />
<property name="name" column="name" />
</join>
</subclass>
public class TypedefEnumUserType extends AbstractToStringUserType implements UserType, Serializable, ParameterizedType {
private Class enumClass;
public void setParameterValues(Properties params) {
this.enumClass = classForProp("enumClassName", params);
}
public final String toString(Object value) throws HibernateException {
if (value == null) {
return null;
}
if (value instanceof Enum) {
final Enum eValue = (Enum) value;
return eValue.name();
}
else {
final String valueClass = value.getClass().getName();
throw new IllegalArgumentException("Error trying to convert value to String. Expected instance of Enum, but got " + valueClass);
}
}
@SuppressWarnings("unchecked")
public final Object fromString(String cached) throws HibernateException {
if (cached == null) {
return null;
}
try {
return Enum.valueOf(enumClass, cached);
}
catch (IllegalArgumentException iae) {
throw new SerializationException(enumClass.getName() + " value in database is invalid: " + cached, iae);
}
}
}
原来我的记录一直在保存。单元测试在保存后立即删除了我的记录,所以我认为它没有被保存。我将测试包装在一个 t运行saction 中,以便在它 运行 之后回滚。傻我。