serious problem accessing CMR
thl-mot Mar 11, 2003 11:57 AMHi,
I have a serious problem in the code below.
Configuration:
JBoss 3.0.4 and JBoss 3.0.6 (both with Tomcat)
Benutzer and Rolle are CMP 2.0 entity beans that have a n-m relation
DbDialogUser and DefaultGroup are DataObjects representing the data from the entities that is used in their constructors
1 public User getUser( Object userKey) {
2 logger.debug( "Look for user: '"+userKey+"'");
3 Benutzer entity= (Benutzer)findUserEntity( userKey);
4 if (entity==null) {
5 logger.debug( " not available");
6 return null;
7 }
8 logger.debug( "Ergebnis: "+entity.getLoginName());
9
10 DbDialogUser dbDialogUser= new DbDialogUser( entity);
11 logger.debug( "DO erzeugt");
12
13 Rolle rEntity = null;
14 DefaultGroup group = null;
15 Collection rc= entity.getRolle();
16 Iterator ri= rc.iterator();
17 Vector v= new Vector();
18 while ( ri.hasNext()) {
19 rEntity= (Rolle)ri.next();
20 group= new DefaultGroup();
21 group.setGroupId( rEntity.getRolleId());
22 group.setDescription( rEntity.getBeschreibung());
23 logger.debug( "-- "+group.getGroupId());
24 dbDialogUser.addGroup( group);
25 }
26 return dbDialogUser;
27 }
The server.log and the Profiler of the SQLServer gives me lots of information that I don't really understand:
The server log tells me, for line 2 that I look for a specific userKey. After that jboss looking for the
entity by sending "select loginName from Benutzer where loginName=?" to the database. Thats fine. In the next step jboss is loading the data of a set of Entities of Benutzer:
SELECT loginName,vorname,.... FROM Benutzer WHERE (loginName=?) OR (loginName=?) OR (loginName=?)
The number and data of (loginName=?) seam to depend on a result of a finder method, that was called on the same entity bean a few steps before. The log information produced by line 5, 8 and 11 are correct. Line 15 causes the following exception:
2003-03-11 17:08:47,937 ERROR [de.netpioneer.system.users.ejb.EjbUserManager] Error in getUser(...)
javax.transaction.TransactionRolledbackException: Load relation failed; CausedByException is:
null; CausedByException is:
Load relation failed; CausedByException is:
null; nested exception is:
javax.ejb.EJBException: Load relation failed; CausedByException is:
null
at org.jboss.ejb.plugins.LogInterceptor.handleException(LogInterceptor.java:271)
at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:208)
at org.jboss.ejb.StatelessSessionContainer.invoke(StatelessSessionContainer.java:313)
at org.jboss.ejb.Container.invoke(Container.java:712)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:517)
at org.jboss.invocation.local.LocalInvoker.invoke(LocalInvoker.java:98)
at org.jboss.invocation.InvokerInterceptor.invoke(InvokerInterceptor.java:102)
at org.jboss.proxy.TransactionInterceptor.invoke(TransactionInterceptor.java:77)
at org.jboss.proxy.SecurityInterceptor.invoke(SecurityInterceptor.java:80)
at org.jboss.proxy.ejb.StatelessSessionInterceptor.invoke(StatelessSessionInterceptor.java:111)
at org.jboss.proxy.ClientContainer.invoke(ClientContainer.java:76)
at $Proxy113.getUser(Unknown Source)
at de.netpioneer.system.users.ejb.EjbUserManager.getUser(EjbUserManager.java:69)
...
I checked the database for any inconsistency (not existing foreign keys, null valued fields that are mapped to int, ...).
As this method is part of a user login procedure and user manager. After a restart of jboss this method is working perfectly for a given user.
But after a while its impossible to access this method again without getting the exception.
Why do I get this exception here? What do I have to do to avoid it?
Why is jboss loading the data of a whole set of entities if just one is needed?
thl-mot