Hibernate的自定义数据类型实现接口之一——UserType祥解

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import net.sf.hibernate.HibernateException;

/**
 * @author hy-he
 *
 */
public interface UserType {
 /**
  * 返回UserType所映射字段的SQL类型(java.sql.Types)
  * 返回类型为int[],其中包含了映射个字段的SQL类型代码
  * (UserType可以映射到一个或者多个字段)
  * @return
  */
 public int[]sqlTypes();
 /**
  * UserType.nullSafeGet()所返回的自定义数据类型
  * @return
  */
 public Class returnedClass();
 /**
  * 自定义数据类型的比对方法
  * 此方法将用作脏数据检查,参数x、y分别为数据的两个副本
  * 如果equals方法返回false,则Hibernate将认为数据发生变化,并将变化更新到数据库表中
  * @param x
  * @param y
  * @return
  * @throws HibernateException
  */
 public boolean equals(Object x,Object y)throws HibernateException;
 /**
  * 从JDBC ResultSet读取数据,将其转换为自定义类型后返回
  * (此方法要求对克能出现null值进行处理)
  * names中包含了当前自定义类型的映射字段名称
  * @param rs
  * @param names
  * @param owner
  * @return
  * @throws HibernateException
  * @throws SQLException
  */
 public Object nullSafeGet(ResultSet rs,String[] names,Object owner)throws HibernateException,SQLException;
 /**
  * 本方法将在Hibernate进行数据保存时被调用
  * 我们可以通过PreparedStateme将自定义数据写入到对应的数据库表字段
  * @param st
  * @param value
  * @param index
  * @throws HibernateException
  * @throws SQLException
  */
 public void nullSafeSet(PreparedStatement st,Object value,int index)throws HibernateException,SQLException;
 /**
  * 提供自定义类型的完全复制方法
  * 本方法将用构造返回对象
  * 当nullSafeGet方法调用之后,我们获得了自定义数据对象,在向用户返回自定义数据之前,
  * deepCopy方法将被调用,它将根据自定义数据对象构造一个完全拷贝,并将此拷贝返回给用户
  * 此时我们就得到了自定义数据对象的两个版本,第一个是从数据库读出的原始版本,其二是我们通过
  * deepCopy方法构造的复制版本,原始的版本将有Hibernate维护,复制版由用户使用。原始版本用作
  * 稍后的脏数据检查依据;Hibernate将在脏数据检查过程中将两个版本的数据进行对比(通过调用
  * equals方法),如果数据发生了变化(equals方法返回false),则执行对应的持久化操作
  *
  * @param value
  * @return
  * @throws HibernateException
  */
 public Object deppCopy(Object value)throws HibernateException;
 /**
  * 本类型实例是否可变
  * @return
  */
 public boolean isMutable();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过继承 QVariant 类来实现自定义类型的转换并添加时间戳。 首先,你需要创建一个类来存储你的自定义类型和时间戳。这个类可以包含两个成员变量:一个是你的自定义类型,另一个是一个 QDateTime 对象,用于存储时间戳。 ```cpp class TimestampedData { public: TimestampedData() {} TimestampedData(const MyType& data) : m_data(data) , m_timestamp(QDateTime::currentDateTime()) {} MyType data() const { return m_data; } QDateTime timestamp() const { return m_timestamp; } private: MyType m_data; QDateTime m_timestamp; }; ``` 接下来,你需要创建一个 QVariant 类的子类来实现 TimestampedData 的转换。在这个子类中,你需要重写 QVariant::canConvert() 和 QVariant::toByteArray() 方法。 ```cpp class TimestampedDataVariant : public QVariant { public: TimestampedDataVariant(const TimestampedData& data) : QVariant(QVariant::UserType) , m_data(data) {} static QVariant fromTimestampedData(const TimestampedData& data) { return QVariant::fromValue(TimestampedDataVariant(data)); } static TimestampedData toTimestampedData(const QVariant& variant) { return variant.value<TimestampedDataVariant>().data(); } bool canConvert(QVariant::Type type) const override { return type == QVariant::ByteArray || type == qMetaTypeId<TimestampedData>(); } QByteArray toByteArray() const override { QDataStream stream; stream << m_data.data() << m_data.timestamp(); return stream.device()->buffer(); } private: TimestampedData m_data; }; ``` 现在,你可以将 TimestampedData 转换为 QVariant。 ```cpp TimestampedData data = ...; QVariant variant = TimestampedDataVariant::fromTimestampedData(data); ``` 你也可以将 QVariant 转换为 TimestampedData。 ```cpp QVariant variant = ...; TimestampedData data = TimestampedDataVariant::toTimestampedData(variant); ``` 注意,如果你想在 QVariant 中添加时间戳,你需要在 TimestampedData 的构造函数中添加代码来初始化时间戳。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值