Following is my entity bean:
@Entity
@Table(name = "NODES")
@SequenceGenerator(name="nodesPKSequenceGenerator" , sequenceName="NODES_PK_SEQ", allocationSize=1)
public class Node implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID", unique = true, nullable = false, precision = 22)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="nodesPKSequenceGenerator")
private BigInteger id;
@Column(name = "EXTERNAL_NODE_ID", unique = true, nullable = false, length = 50)
private String externalNodeId;
@Column(name = "LAT_DEG", precision = 2)
private Integer latDeg;
@Column(name = "LAT_DIRECTION", length = 1)
private Character latDirection;
@Column(name = "LAT_MIN", precision = 2)
private Integer latMin;
@Column(name = "LAT_SEC", precision = 4, scale = 2)
private Float latSec;
@Column(name = "LONG_DEG", precision = 3)
private Integer longDeg;
@Column(name = "LONG_DIRECTION", length = 1)
private Character longDirection;
@Column(name = "LONG_MIN", precision = 2)
private Integer longMin;
@Column(name = "LONG_SEC", precision = 4, scale = 2)
private Float longSec;
@OneToMany(mappedBy = "node1", fetch = FetchType.LAZY)
private List<Link> links1;
@OneToMany(mappedBy = "node2", fetch = FetchType.LAZY)
private List<Link> links2;
public Node()
{
}
//and then getters/setters follow
}
And this is my spring bean file:
<jee:jndi-lookup id="datasource" jndi-name="${jndi.jdbc}"
resource-ref="true" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotati on.AnnotationSessionFactoryBean">
<property name="dataSource" ref="datasource" />
<property name="annotatedClasses">
<list>
<value>com.network.entity.Node</value>
<value>com.network.entity.Link</value>
</list>
</property>
<property name="hibernateProperties">
<bean class="org.springframework.beans.factory.config.Pr opertiesFactoryBean">
<property name="location" value="classpath:resources/hibernate.properties" />
</bean>
</property>
</bean>
<bean id="networkTransactionManager" class="org.springframework.orm.hibernate3.Hibernat eTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="networkTransactionManager"/>
Lastly the service class:
public class NodeServiceImpl implements INodeService
{
private IApplicationDAO appDAO;
@Transactional(propagation = Propagation.REQUIRED)
private void convertToNodeVO(final Node node, final NodeVO nodeVO)
{
nodeVO.setId(node.getId().toString());
nodeVO.setExternalNodeId(node.getExternalNodeId()) ;
nodeVO.setLatDeg(node.getLatDeg().toString());
nodeVO.setLatMin(node.getLatMin().toString());
nodeVO.setLatSec(node.getLatSec().toString());
nodeVO.setLatDirection(LatDirection.valueOf(node.g etLatDirection()));
nodeVO.setLongDeg(node.getLongDeg().toString());
nodeVO.setLongMin(node.getLongMin().toString());
nodeVO.setLongSec(node.getLongSec().toString());
nodeVO.setLongDirection(LongDirection.valueOf(node .getLongDirection()));
LinkVO linkVOTemp = null;
NodeVO nodeVOTemp = null;
List<Link> linksTemp = node.getLinks1(); //this is where it throws exception
List<LinkVO> linkVOs = null;
if (!(linksTemp == null) && !(linksTemp.size() == 0))
{
linkVOs = new ArrayList<LinkVO>(linksTemp.size());
for (Link linkTemp : linksTemp)
{
linkVOTemp = new LinkVO();
linkVOTemp.setId(linkTemp.getId().toString());
linkVOTemp.setExternalLinkId(linkTemp.getExternalL inkId());
linkVOTemp.setLinkDistance(linkTemp.getLinkDistanc eKms().toString());
linkVOTemp.setAzimuth1(linkTemp.getAzimuth1().toSt ring());
linkVOTemp.setAzimuth2(linkTemp.getAzimuth2().toSt ring());
nodeVOTemp = new NodeVO();
nodeVOTemp.setId(linkTemp.getNode1().getId().toStr ing());
nodeVOTemp.setExternalNodeId(linkTemp.getNode1().g etExternalNodeId());
linkVOTemp.setNode1(nodeVO);
nodeVOTemp = new NodeVO();
nodeVOTemp.setId(linkTemp.getNode2().getId().toStr ing());
nodeVOTemp.setExternalNodeId(linkTemp.getNode2().g etExternalNodeId());
linkVOTemp.setNode2(nodeVO);
linkVOs.add(linkVOTemp);
}
nodeVO.setLinks1(linkVOs);
}
linkVOTemp = null;
nodeVOTemp = null;
linksTemp = node.getLinks2();
linkVOs = null;
if (!(linksTemp == null) && !(linksTemp.size() == 0))
{
linkVOs = new ArrayList<LinkVO>(linksTemp.size());
for (Link linkTemp : linksTemp)
{
linkVOTemp = new LinkVO();
linkVOTemp.setId(linkTemp.getId().toString());
linkVOTemp.setExternalLinkId(linkTemp.getExternalL inkId());
linkVOTemp.setLinkDistance(linkTemp.getLinkDistanc eKms().toString());
linkVOTemp.setAzimuth1(linkTemp.getAzimuth1().toSt ring());
linkVOTemp.setAzimuth2(linkTemp.getAzimuth2().toSt ring());
nodeVOTemp = new NodeVO();
nodeVOTemp.setId(linkTemp.getNode1().getId().toStr ing());
nodeVOTemp.setExternalNodeId(linkTemp.getNode1().g etExternalNodeId());
linkVOTemp.setNode1(nodeVO);
nodeVOTemp = new NodeVO();
nodeVOTemp.setId(linkTemp.getNode2().getId().toStr ing());
nodeVOTemp.setExternalNodeId(linkTemp.getNode2().g etExternalNodeId());
linkVOTemp.setNode2(nodeVO);
linkVOs.add(linkVOTemp);
}
nodeVO.setLinks2(linkVOs);
}
}
@Override
@Transactional(propagation = Propagation.REQUIRED)
public List<NodeVO> findByExample(NodeVO nodeVO)
{
// TODO Auto-generated method stub
Node exampleNode = new Node();
this.convertToNode(nodeVO, exampleNode);
List<Node> nodes = appDAO.findByExample(exampleNode);
NodeVO nodeVOTemp = null;
if (nodes == null || nodes.size() == 0)
return null;
List<NodeVO> nodeVOs = new ArrayList<NodeVO>(nodes.size());
for (Node nodeTemp : nodes)
{
nodeVOTemp = new NodeVO();
this.convertToNodeVO(nodeTemp, nodeVOTemp);
nodeVOs.add(nodeVOTemp);
}
return nodeVOs;
}
Although I have made service methods as Transactional with propagation=Propagation.REQUIRED but still lazy loading gives trouble by throwing following exception:
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.network.entity.Node.links1, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollect ion.throwLazyInitializationException(AbstractPersi stentCollection.java:383)
at org.hibernate.collection.AbstractPersistentCollect ion.throwLazyInitializationExceptionIfNotConnected (AbstractPersistentCollection.java:375)
at org.hibernate.collection.AbstractPersistentCollect ion.readSize(AbstractPersistentCollection.java:122 )
at org.hibernate.collection.PersistentBag.size(Persis tentBag.java:248)
at com.network.service.NodeServiceImpl.convertToNodeV O(NodeServiceImpl.java:143)
at com.network.service.NodeServiceImpl.findByExample( NodeServiceImpl.java:264)
Anyone can tell why @Transactional is not working? It seems I m missing some very fine point here.


Reply With Quote
!!!
