`
suyejun
  • 浏览: 888 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

自定义Usertype不能更新的问题(特殊情况)

阅读更多
问题解决,是deepCopy方法没写好。

数据库是mysql5.0。
由于用户表有很多跟用户相关的数据,但是平时查询不作为条件使用,所以我设置了一个text字段Properties用于记录用户的一些信息,比如电话号码身份证等等。
public class ApplicationUserProperties implements Serializable
{
    private String identityName = null;

    private String identityCode = null;

    private boolean identityHidden = false;

    private boolean identityVeirified = false;

    private String phoneNumber = null;

    private boolean phoneNumberVerified = false;

    private boolean phoneNumberHidden = false;

    private String mobileNumber = null;

    private boolean mobileNumberVerified = false;

    private boolean mobileNumberHidden = false;

    /*---get and set methods--*/
}


写了一个自定义类型,用于把各个属性使用json方式存储,比如{"mobileNumber":1234567,“mobileNumber":false}
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

import net.sf.json.JSONObject;

import org.hibernate.HibernateException;
import org.sothis.util.JsonUtils;

import com.bangyo.user.ApplicationUserProperties;

public class ApplicationUserPropertiesUserType extends AbstractMutableUserType
{
    private final static int[] SQL_TYPES =
    {
        Types.VARCHAR
    };

    public Object deepCopy(Object value) throws HibernateException
    {
        if (value==null)
            return null;

        return (ApplicationUserProperties)value;
    }

    public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
        throws HibernateException, SQLException
    {
        if (rs.wasNull())
            return null;

        String props = rs.getString(names[0]);

        if (null==props)
            return null;

        ApplicationUserProperties properties = new ApplicationUserProperties();
        JsonUtils.toBean(properties, JSONObject.fromString(props));
        return properties;
    }

    public void nullSafeSet(PreparedStatement st, Object value, int index)
        throws HibernateException, SQLException
    {
        if (value==null)
        {
            st.setNull(index, Types.VARCHAR);
        }
        else
        {
            ApplicationUserProperties userInfo = (ApplicationUserProperties)value;
            Object jsonObject = JsonUtils.fromBean(userInfo);
            st.setString(index, jsonObject.toString());
        }
    }

    public Class<?> returnedClass()
    {
        return ApplicationUserProperties.class;
    }

    public int[] sqlTypes()
    {
        return SQL_TYPES;
    }
}



自定义类型的父类:
import java.io.Serializable;

import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;

public abstract class AbstractMutableUserType implements UserType
{
    public Object assemble(Serializable cached, Object owner)
        throws HibernateException
    {
        return deepCopy(cached);
    }

    public Serializable disassemble(Object value) throws HibernateException
    {
        return (Serializable)deepCopy(value);
    }

    public boolean equals(Object x, Object y) throws HibernateException
    {
        if (x==y)
            return true;
        if (x==null||y==null)
            return false;
        return x.equals(y);
    }

    public int hashCode(Object x) throws HibernateException
    {
        if (x==null)
            return 0;

        return x.hashCode();
    }

    public Object replace(Object original, Object target, Object owner)
        throws HibernateException
    {
        return deepCopy(original);
    }

    public boolean isMutable()
    {
        return true;
    }
}


ApplicationUser.hbm.xml中的引用
        <property name="properties" column="Properties"
            type="ApplicationUserPropertiesUserType"
            not-null="false" />


接着问题就是,insert操作的时候这个字段的值可以被插入,但是update操作的时候,这个值无论怎么设都无法更新,似乎是hibernate不知道这个值被更新了。
更新时的代码
        applicationUser.setGender(Gender.MALE);

        applicationUser.getProperties().setLastProductPoin(product.getPoin());
        applicationUser.getProperties().setLastProductTitle(product.getTitle());
        applicationUser.getProperties().setLastProductTagRootPoin(
            product.getTagRootPoin());
        applicationUser.getProperties()
            .setLastProductTagRootTitle(tagRootTitle);
        applicationUser.getProperties().setLastProductDateTime(
            "2007-01-01 11:00:00");
        applicationUserPersister.update(applicationUser);



其他类型可以,比如性别的,直接user.setGender(Gender.MALE),接着update就可以更新,可是上面那个就是不行,请大家帮我看看是为什么。谢谢
分享到:
评论
2 楼 suyejun 2007-11-16  
suyejun 写道
好像知道了,可能是equals和hashcode方法没override。
两个方法覆盖了还是不行
1 楼 suyejun 2007-11-16  
好像知道了,可能是equals和hashcode方法没override。

相关推荐

    用Hibernate实现领域对象的自定义字段

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务...在实际开发中,理解并熟练运用自定义类型能帮助我们更好地解决复杂的数据存储问题,提高系统的扩展性和适应性。

    简要分析Java的Hibernate框架中的自定义类型

    当我们发现Hibernate默认的数据类型无法满足我们存储数据的特殊要求时,例如需要处理复杂对象或者自定义逻辑时,就可以通过自定义类型进行解决。 自定义类型主要有两种实现方式: 1. 实现`UserType`接口:这是最...

    hibernate映射Oracle中LONG类型

    在本例中,我们定义了一个名为 CustomLong 的类,该类实现了 UserType 接口,并提供了自定义的读写操作。 在 CustomLong 类中,我们定义了assemble、deepCopy、disassemble、equals、hashCode、isMutable 和 ...

    怎样在VS2005中添加自定义的C语言关键字

    然而,由于VS2005默认只支持标准的C语言关键字,对于单片机开发中常用的特殊关键字(如`sbit`、`sfr`等)并不能很好地识别和支持。这不仅影响代码的可读性和美观性,还可能导致一些编译错误或警告。因此,本文将详细...

    Sql编程规范

    - **特殊值的使用**:在某些情况下,可能会使用特殊值如`NULL`或`NIL`来表示某种状态。这些值通常用来表示空值或者无效值。 - **问题**:如果一个类型中同时使用了`NULL`和`NIL`两个不同的特殊值,则可能引起混淆。...

    PyQt(Python+Qt)学习随笔:枚举类QTreeWidgetItem.ItemType、QListWidgetItem.ItemType的取值及含义

    例如,如果需要创建一个特殊的树形视图节点,我们可以定义一个类型值为`QTreeWidgetItem.UserType + 1`的QTreeWidgetItem,然后在处理视图逻辑时,可以根据这个自定义的类型值来进行特殊的操作。 除了`type`参数外...

    hbm xml配置详解 ssh框架

    自定义映射类型虽然增加了项目的复杂度,但能够提供更高的灵活性,解决特殊场景下的问题。 总之,理解Hibernate的`.hbm.xml`配置文件及其映射类型是掌握Hibernate ORM的基础,它为Java对象与数据库之间的交互提供了...

    vb学生成绩管理系统

    MsgBox "该记录已经存在,不能继续增加", vbCritical + vbOKOnly Exit Sub End If '拼写Insert插入语句 strSQL = "Insert Into 学生情况表(学号,姓名)" strSQL = strSQL + " Values('" + Text1.Text + "'," ...

    hibernate3中文手册

    11. **自定义类型**:如果需要对特殊类型的属性进行映射,可以实现UserType接口来自定义类型。 12. **实体状态管理**:区分临时态、持久态、游离态和删除态,理解它们之间的转换过程。 13. **性能优化**:包括...

    05_JPA详解_日期_枚举等字段类型的JPA映射.zip

    对于JPA不直接支持的数据类型,可以通过实现`UserType`接口来自定义字段类型。这种方式比较复杂,但能实现对任何类型的数据的持久化。 ### 5. JPA实体配置 实体类需要使用`@Entity`注解标识,表名可通过`@Table`...

    synon2hbm-开源

    “Hibernate UserType”则是Hibernate提供的一种扩展机制,允许用户自定义数据类型的持久化行为。例如,如果你有一个特殊的数据类型需要在数据库中存储,但Java没有对应的原生类型,你可以实现UserType接口来自定义...

    hibernate存取json数据的代码分析

    - **自定义JsonType**:`JsonType`实现了`UserType`接口,这是Hibernate中自定义类型的基础。这个类需要覆盖一些关键方法,如`sqlTypes`返回数据库字段的SQL类型,`returnedClass`指定返回的Java类型,以及`equals`...

    Thinkphp单字母函数使用指南

    但要注意,跨项目调用控制器时,如果有针对当前控制器的特殊变量操作,可能会遇到未知问题,因此官方建议公共调用的控制器层应独立开发,减少依赖。 2. B方法: B方法主要用于执行特定的行为(Behavior)。例如: ...

Global site tag (gtag.js) - Google Analytics