我在系统中有几个不同的UserTypes(org.hibernate.usertype.UserType)。对于这个问题,我将重点关注我们使用Joda time DateTime及其UserType,PersistentDateTime。
我已成功将UserType以编程方式绑定到PersistentClass:
public void customize(Ejb3Configuration config) {
Iterator<PersistentClass> itr = config.getClassMappings();
while(itr.hasNext()) {
PersistentClass persistentClass = itr.next();
for(Iterator<Property> iter = persistentClass.getPropertyIterator(); iter.hasNext();) {
if(property.getType().getReturnedClass().equals(DateTime.class)) {
SimpleValue original = (SimpleValue) property.getValue();
SimpleValue value = new SimpleValue(original.getTable());
value.setTypeName("org.joda.time.contrib.hibernate.PersistentDateTime");
value.setTypeParameters(new Properties());
value.setNullValue(original.getNullValue());
Iterator<Column> colIter = original.getColumnIterator();
while(colIter.hasNext())
value.addColumn(colIter.next());
property.setValue(value);
}
}
}
}
上面的代码工作...但不适用于不是PersistentClass实例的组件。我尝试了以下代码来处理组件......但是当它看起来应该是它时它不起作用。
public void customize(Ejb3Configuration config) {
Iterator<PersistentClass> itr = config.getClassMappings();
while(itr.hasNext()) {
PersistentClass persistentClass = itr.next();
for(Iterator<Property> iter = persistentClass.getPropertyIterator(); iter.hasNext();) {
Property property = iter.next();
if(property.getType().getReturnedClass().equals(DateTime.class)) {
SimpleValue original = (SimpleValue) property.getValue();
SimpleValue value = new SimpleValue(original.getTable());
value.setTypeName("org.joda.time.contrib.hibernate.PersistentDateTime");
value.setTypeParameters(new Properties());
value.setNullValue(original.getNullValue());
Iterator<Column> colIter = original.getColumnIterator();
while(colIter.hasNext())
value.addColumn(colIter.next());
property.setValue(value);
} else if (property.getValue() instanceof Component) {
Component c = (Component)property.getValue();
for(Iterator<Property> cIt= c.getPropertyIterator(); cIt.hasNext();) {
Property cProperty = cIt.next();
if(cProperty.getType().getReturnedClass().equals(DateTime.class)) {
SimpleValue original = (SimpleValue) cProperty.getValue();
SimpleValue value = new SimpleValue(original.getTable());
value.setTypeName("org.joda.time.contrib.hibernate.PersistentDateTime");
value.setTypeParameters(new Properties());
value.setNullValue(original.getNullValue());
Iterator<Column> colIter = original.getColumnIterator();
while(colIter.hasNext())
value.addColumn(colIter.next());
cProperty.setValue(value);
}
}
}
}
}
我试过跟踪hibernate代码。似乎hibernate以某种方式处理组件与PersistentClasses不同,但我似乎无法弄清楚如何。上面的代码似乎在组件属性上正确设置了typeName,但是当在@Embeddable组件中使用DateTime时,hibernate从不使用PersistentDateTime UserType。当然,如果我添加@Type注释一切正常。我不想添加这个注释。我希望能够以编程方式为UserType绑定UserType,就像PersistentClasses一样。
任何见解?
谢谢!