[jboss-user] [EJB 3.0] - Implementing business-logic: ConcurrentModificationException

dgdwinte do-not-reply at jboss.com
Sat Mar 22 15:38:46 EDT 2008


Hi all,

I use a stateless session-bean to implement the business-logic to save entity-beans. The stateless session-bean uses injection of the entitymanager as follows: 


  | @Stateless(mappedName = "PersonDAO")
  | public class PersonDAO extends DAOBasicOperationsAbstractClass<Person> implements PersonDAOInterfaceLocal, PersonDAOInterfaceRemote{
  | 	@PersistenceContext(unitName = "texaco", type = PersistenceContextType.TRANSACTION)
  | 	EntityManager em;
  | 

Before saving the "Person"-entitybean, I'd like to do some checks by executing a native read-query in a separate method on the same table (join with other ones) where I'd like to save the Person:


  | 		Query query=em.createNativeQuery(
  | 				querystring
  | 		); 
  | 		
  | 		query.setParameter("TELEPHONENUMBER_1", person.getPhonenumber1()==null?"K":person.getPhonenumber1().getPhoneNumber());
  | 		query.setParameter("TELEPHONENUMBER_2", person.getPhonenumber2()==null?"K":person.getPhonenumber2().getPhoneNumber()); 
  | 		query.setParameter("GSMNUMBER_1", person.getGsmnumber1()==null?"K":person.getGsmnumber1().getPhoneNumber()); 
  | 		query.setParameter("GSMNUMBER_2", person.getGsmnumber2()==null?"K":person.getGsmnumber2().getPhoneNumber()); 
  | 		if (update) query.setParameter("ID", person.getId()); 
  | 		Collection<Person> pers_coll=executeMultipleResultQuery(query); 
  | 		if (pers_coll.size()>0) return false;  
  | 		else return true;  
  | 

If this method returns true, the new person will not be saved, otherwise he will be saved as follows:


  | 			if (!checkPhoneNumberValidity(person, true)) throw new PersonValidationException(); 
  | 			Person person_orig=findById(person.getId()); 
  | 			if (!person_orig.equals(person)){
  | 				person_orig.getLatestValidPersonProperty().getValidityinterval().invalidate();
  | 				person.getLatestValidPersonProperty().setValidityinterval(new ValidityInterval(new GregorianCalendar(), new GregorianCalendar(2099, 12, 12))); 
  | 				person.getLatestValidPersonProperty().setId(null); 
  | 				person_orig.getPersonproperties().add(person.getLatestValidPersonProperty());
  | 				person_orig.setName(person.getName()); 
  | 				person_orig.setFirstname(person.getFirstname()); 
  | 				person_orig.setNationalregisternumber(person.getNationalregisternumber()); 
  | 				person_orig.setIdentitycardnumber(person.getIdentitycardnumber()); 
  | 				person_orig.setBirthdate(person.getBirthdate()); 
  | 				person_orig.setSex(person.getSex());
  | 				person_orig.deepValidate(); 
  | 				executeMerge(em, person_orig);
  | 			}
  | 

Please note, I also make some comparisons with the original object as I work with properties. In this scenario, I get a ConcurrentModificationException. Seems logic to me, but how to solve this in a proper way, because the checks must happen within the same transaction. 

Any help or advice is very appreciated! 

Best regards,
Davy. 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4138436#4138436

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4138436



More information about the jboss-user mailing list