java - Hibernate: Programmatically binding UserTypes on Components -
i have several different usertypes (org.hibernate.usertype.usertype) in system. question focus on fact use joda time datetime , usertype, persistentdatetime.
i have bound usertype programmatically persistentclass's by:
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); } } } }
the above code works... not components not instances of persistentclass. tried following code handle components well... doesn't work when seems should.
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); } } } } }
i have tried tracing through hibernate code. seems hibernate somehow handles components differently persistentclasses can't seem figure out how. code above seems correctly set typename on component property hibernate never uses persistentdatetime usertype when datetime used inside @embeddable component. of course, if add @type annotation works. don't want have add annotation. want able bind usertype programmatically components same persistentclasses.
any insights?
thanks!
Comments
Post a Comment