首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate不会保存UserType

Hibernate不会保存UserType
EN

Stack Overflow用户
提问于 2015-01-22 20:01:23
回答 1查看 191关注 0票数 0

我有一个对象(人),我试图使用Hibernate保存到数据库中。Person有一个Hibernate UserType对象。我无法将人保存到数据库,我认为问题是UserType。

我记录了Sql以查看发生了什么,并且注意到记录器跳过了UserType参数。这是因为没有将值发送到数据库吗?

代码语言:javascript
复制
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);
    }
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-23 10:12:52

原来我的记录一直在存钱。单元测试在保存后立即删除我的记录,所以我假定它没有被保存。我将测试包装在一个事务中,以便在它运行后回滚。我真傻。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28097628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档