Hello,
I wrote a UserType to serialize a Map variable to a varchar column. I included the code for this below. It works fine for inserting. But when I attempt to retrieve (after restarting JBoss) the parent business object, TaskVO, I get a LazyInitializationException.
Any ideas on the cause? FYI I'm retrieving a collection of TaskVOs via a stateless Session Bean, so EJBs are involved. One other note - our serializer uses an XML Serializer we wrote because Sun's XmlEncoder is so poor compared to C# XmlSerializer.
Here is the descriptor for TaskVO business object:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="com.teradata.tap.system.scheduler.TaskVO" table="TAP_TASK">
<id name="id" column="ID" type="long">
<generator class="net.sf.hibernate.tap.SessionBeanSequenceGenerator"/>
</id>
<property name="label" column="Label"/>
<property name="className" column="ClassName"/>
<property name="parameters" column="Parameters" type="net.sf.hibernate.tap.MapUserType"/>
</class>
</hibernate-mapping>
Here is the stack trace:
[code]
11:23:41,533 ERROR [LazyInitializationException] Failed to lazily initialize a c
ollection - no Session
net.sf.hibernate.LazyInitializationException: Failed to lazily initialize a coll
ection - no Session
at net.sf.hibernate.collection.PersistentCollection.initialize(Persisten
tCollection.java:167)
at net.sf.hibernate.collection.PersistentCollection.read(PersistentColle
ction.java:64)
at net.sf.hibernate.collection.Set.equals(Set.java:384)
at java.util.ArrayList.indexOf(ArrayList.java:216)
at java.util.ArrayList.contains(ArrayList.java:197)
at com.teradata.tap.system.xml.Decoder.startNode(Decoder.java:187)
at com.teradata.tap.system.xml.Handler.startElement(Handler.java:45)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(AbstractSAXP
arser.java:452)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElemen
t(XMLDocumentFragmentScannerImpl.java:821)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContent
Dispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1541)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(XM
LDocumentFragmentScannerImpl.java:346)
at org.apache.xerces.parsers.DTDConfiguration.parse(DTDConfiguration.jav
a:529)
at org.apache.xerces.parsers.DTDConfiguration.parse(DTDConfiguration.jav
a:585)
at org.apache.xerces.parsers.XMLParser.parse(XMLParser.java:152)
at org.apache.xerces.parsers.AbstractSAXParser.parse(AbstractSAXParser.j
ava:1142)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:345)
at com.teradata.tap.system.xml.Decoder.<init>(Decoder.java:64)
at net.sf.hibernate.tap.MapUserType.nullSafeGet(MapUserType.java:112)
at net.sf.hibernate.type.CustomType.nullSafeGet(CustomType.java:97)
at net.sf.hibernate.type.AbstractType.hydrate(AbstractType.java:66)
at net.sf.hibernate.loader.Loader.hydrate(Loader.java:419)
at net.sf.hibernate.loader.Loader.loadFromResultSet(Loader.java:373)
at net.sf.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:342)
at net.sf.hibernate.loader.Loader.getRow(Loader.java:281)
at net.sf.hibernate.loader.Loader.doFind(Loader.java:159)
at net.sf.hibernate.loader.Loader.loadCollection(Loader.java:602)
at net.sf.hibernate.loader.OneToManyLoader.initialize(OneToManyLoader.ja
va:102)
at net.sf.hibernate.impl.SessionImpl.initialize(SessionImpl.java:2897)
at net.sf.hibernate.collection.PersistentCollection.getInitialValue(Pers
istentCollection.java:128)
at net.sf.hibernate.type.PersistentCollectionType.getCollection(Persiste
ntCollectionType.java:74)
at net.sf.hibernate.type.PersistentCollectionType.resolveIdentifier(Pers
istentCollectionType.java:177)
at net.sf.hibernate.impl.SessionImpl.initializeEntity(SessionImpl.java:1
959)
at net.sf.hibernate.loader.Loader.doFind(Loader.java:196)
at net.sf.hibernate.loader.Loader.find(Loader.java:620)
at net.sf.hibernate.loader.CriteriaLoader.list(CriteriaLoader.java:81)
at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:3157)
at net.sf.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:65)
at com.teradata.tap.system.persistence.ejb.PersistenceManagerBean.getVec
tor(PersistenceManagerBean.java:1334)
And here is my MapUserType, nullSafeGet function:
[code]
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
// Only 1 column
Object obj = rs.getObject(names[0]);
if (obj != null && obj.toString().length() > 0) {
Map map = null;
String input = obj.toString();
try{
Decoder decoder = new Decoder((String)input);
map = (Map) decoder.getObject();
}
catch(Exception e){
e.printStackTrace();
}
return map;
}
return null;
}
[/code]