【问题标题】:Managed Entity is getting detached托管实体正在分离
【发布时间】: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


【解决方案1】:

我已经得到了答案,实际上“staffDao.findUnique(loginBean.getUserName())”并没有使 Staff 实体受到管理。所以我必须使用合并来管理 Staff 实体并且对其进行任何更改持久化到数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-17
    • 2012-01-16
    • 2020-07-30
    • 1970-01-01
    • 2012-05-12
    • 2015-08-10
    • 2015-03-17
    • 2023-03-14
    相关资源
    最近更新 更多