Strange behavior in session context object
kingdom119 Sep 23, 2009 9:09 AMAs my project has to switch between two database,so I extend EntityManagerFactory.But in my customized class, we faced a very strange behavior. First I'd like to show my code first.
@Scope(ScopeType.APPLICATION)
public class DdsEntityManagerFactory extends EntityManagerFactory {
@In
private CurrentUserInformation currentUserInformation;
private static Map<String, javax.persistence.EntityManagerFactory> factorys;
@Unwrap
public javax.persistence.EntityManagerFactory getEntityManagerFactory() {
if (!DdsUtil.isNotEmptyString(currentUserInformation
.getSelectedDataBase().getDatabaseUnitName())) {
currentUserInformation.getSelectedDataBase().setDatabaseUnitName(
super.getPersistenceUnitName());
}
if (factorys.containsKey(currentUserInformation.getSelectedDataBase()
.getDatabaseUnitName())) {
return factorys.get(currentUserInformation.getSelectedDataBase()
.getDatabaseUnitName());
}
return null;
}
@Create
public void startup(Component component) throws Exception {
Map<String, Database> dbs = DatabaseCfgBundleLoader
.getDatabasesFromProperties();
factorys = new HashMap<String, javax.persistence.EntityManagerFactory>();
for (Database db : dbs.values()) {
if (!factorys.containsKey(db.getDatabaseUnitName())) {
super.setPersistenceUnitName(db.getDatabaseUnitName());
factorys.put(db.getDatabaseUnitName(), super
.createEntityManagerFactory());
}
}
}...........................here is the code of CurrentUserInformation class:
@Name("currentUserInformation")
@Scope(ScopeType.SESSION)
@AutoCreate
public class CurrentUserInformation extends Identity implements Serializable {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unused")
@Logger
private Log log;
private User currentUser;
private Trial selectedTrial;
private Database selectedDataBase;
...........................OK, normally,my project will works well.But sometimes, it will throw nullpointer exception at
if (!DdsUtil.isNotEmptyString(currentUserInformation
.getSelectedDataBase().getDatabaseUnitName()))
or if (factorys.containsKey(currentUserInformation.getSelectedDataBase()
.getDatabaseUnitName()))
But, how will this happen? my currentUserInformation has session context. Why it lose value sometimes.Please help.thanks.