[英]Managed Entity is getting detached
I have a java code where i am updating the staff entity. 我有一个Java代码,我正在更新人员实体。 I am using the application managed entity manager. 我正在使用应用程序管理的实体管理器。 i have a condition in the login page where if the user has given correct username/password his last login time will be updated. 我在登录页面中有一个条件,如果用户提供了正确的用户名/密码,他的上次登录时间将被更新。
But the update is not happening and i am getting an exception that the entity has been detached.Please see the Code below :- 但是更新没有发生,并且我收到一个例外,该实体已被分离。请参见下面的代码:-
GenericDaoImpl.java GenericDaoImpl.java
public class GenericDaoImpl<T> implements GenericDao<T> {
private static final String PERSISTENCE_UNIT_NAME = "expenseCalculator";
private static EntityManagerFactory factory;
protected static EntityManager em;
private EntityTransaction etr;
protected Class<T> domainClass;
/** The domain object name. */
protected String domainObjectName = null;
public synchronized static EntityManagerFactory getfactory(){
if (null == factory) {
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
}
return factory;
}
@SuppressWarnings("unchecked")
public GenericDaoImpl() {
em = getfactory().createEntityManager();
domainClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Entity entityAnn = (Entity) domainClass.getAnnotation(Entity.class);
if (entityAnn != null && !entityAnn.name().equals("")) {
domainObjectName = entityAnn.name();
} else {
domainObjectName = domainClass.getSimpleName();
}
}
public T create(T t) {
etr = em.getTransaction();
etr.begin();
em.persist(t);
etr.commit();
return t;
}
}
StaffServiceImpl.java StaffServiceImpl.java
public Staff authenticateStaff(LoginBean loginBean) {
staff = staffDao.findUnique(loginBean.getUserName());
if (null != staff) {
if (staff.getIsBlocked() == 'N' && staff != null && staff.getUserName().equals(loginBean.getUserName())
&& staff.getPassword().equals(loginBean.getPassword())) {
staff.setLastLogin(new Date());
//This is giving an exception..
new StaffDaoImpl().create(staff);
return staff;
} else if (staff.getIsBlocked() == 'N' && staff != null
&& staff.getUserName().equals(loginBean.getUserName())) {
updateUnsuccessfulAttemptsAndBlockedStatus(staff);
}
}
return null;
}
StaffDaoImpl.java :- StaffDaoImpl.java:-
@Repository
@Component
public class StaffDaoImpl extends GenericDaoImpl<Staff> implements StaffDao {
public Staff findUnique(String userName) {
TypedQuery<Staff> query = em.createNamedQuery(domainObjectName + ".findByUserName", domainClass);
query.setParameter("username", userName);
Staff staff = null;
try {
staff = query.getSingleResult();
} catch (NoResultException e) {
staff = null;
}
return staff;
}
In the Class StaffServiceImpl.java you will see that i have made the Staff entity managed y calling the "staffDao.findUnique(loginBean.getUserName());" 在类StaffServiceImpl.java中,您将看到我已通过调用“ staffDao.findUnique(loginBean.getUserName());”管理了Staff实体。 but still it gives me exception that the entity Staff is detached. 但仍然给我一个例外,即实体Staff是独立的。 Any help is highly appreciated. 非常感谢您的帮助。
我得到了答案,实际上““ staffDao.findUnique(loginBean.getUserName())”不会使Staff实体受管理。因此,我必须使用merge来管理Staff实体,并将对它的任何更改都保存到数据库中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.