我正在编写一个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初始化期间获取拥有实体的定义(类似于参数的传递方式)?
答案 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)。