Hibernate:以编程方式绑定组件上的UserTypes

时间:2010-04-29 18:07:07

标签: java hibernate configuration components usertype

我在系统中有几个不同的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一样。

任何见解?

谢谢!

0 个答案:

没有答案