【发布时间】:2018-02-05 14:49:08
【问题描述】:
我有一个 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
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 :-
@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;
}
在 StaffServiceImpl.java 类中,您将看到我已将 Staff 实体管理为 y,调用“staffDao.findUnique(loginBean.getUserName());”但它仍然给我一个例外,实体人员是分离的。非常感谢任何帮助。
【问题讨论】:
-
你到底遇到了什么异常?
-
org.hibernate.PersistentObjectException:分离的实体传递给持久化:org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:124) 中的 com.expensecalculator.domain.Staff 在 org.hibernate .event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58) 在 org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:778) 在 org.hibernate.internal.SessionImpl.persist(SessionImpl.java:751) 在org.hibernate.internal.SessionImpl.persist(SessionImpl.java:756)
-
既然是更新,您可以考虑使用
merge而不是persist -
JPA Web 应用程序通常会出现分离对象的问题(连续的 Web 会话与两个独立的 JPA 会话不兼容),存在许多解决方案,取决于使用的框架。抱歉,无法在评论中表达
-
>
new StaffDaoImpl().create(staff);为什么不用Spring注入StaffDaoImpl而是手动构建呢?尝试将其提取到私有字段并标记@Autowired
标签: java spring-mvc jpa