创建自定义Hibernate UserType:找出当前实体表名称

时间:2009-03-23 02:27:27

标签: java hibernate

我正在编写一个Hibernate CompositeUserType,为了将自定义对象序列化为JDBC,我需要知道我正在更新的表的名称(因为我的工具附加到表中有一些配置)。

我现在能够正常工作的唯一方法是使用实​​体表名显式地参数化我的UserType,这是多余且容易出错的。

有没有办法在“nullSafeSet”中获取此信息?

public void nullSafeSet(PreparedStatement ps, Object value, int index,
        SessionImplementor session) 
        throws HibernateException, SQLException {

    // find out the entity table name here

如果没有,是否有办法在UserType初始化期间获取拥有实体的定义(类似于参数的传递方式)?

1 个答案:

答案 0 :(得分:1)

我已经做了类似的事情,我需要在运行时基于其他一些设置在自定义类型上设置属性。使用配置,您可以使用自定义类型动态设置属性,如下所示:

for (Iterator iter=configuration.getClassMappings(); iter.hasNext();) {
  PersistentClass pc = (PersistentClass)iter.next();
  for (Iterator iter2=pc.getPropertyIterator(); iter2.hasNext();) {
    Property property = (Property)iter2.next();
    if (property.getType().getName().equals("your custom type")) {
      SimpleValue v = (SimpleValue)property.getValue();
      v.getTypeParameters().setProperty("table property", pc.getTable().getName());
    }
  }
}

显然,这里有很多假设(每个实体一个表,自定义类型是单个属性等),但它应该有用。

我没有尝试过的另一种可能性是在nullSafeSet方法中使用PreparedStatement元数据,例如:statement.getMetaData()。getTableName(index)。