当前位置: 首页 > 知识库问答 >
问题:

托管实体正在分离

慕容玉书
2023-03-14

我有一个java代码,我正在更新staff实体。我正在使用应用程序管理的实体管理器。我在登录页面中有一个条件,如果用户提供了正确的用户名/密码,他的上次登录时间将被更新。

但是更新没有发生,我得到一个实体已被分离的异常。请参阅下面的代码:-

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;
    }
} 
    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类中,您将看到我通过调用“StaffDAO.findUnique(loginBean.getUserName());”来管理Staff实体。但实体工作人员是独立的,这给了我一个例外。任何帮助都是非常感谢的。

共有1个答案

沃阳曜
2023-03-14

我已经得到了答案,实际上“staffdao.findunique(loginBean.getUsername())”并不能管理Staff实体,所以我必须使用merge来管理Staff实体,并且对它的任何更改都保留到DB中。

 类似资料:
  • 问题内容: “独立实体”是什么意思?在交易期间如何将托管实体转换为独立实体? 问题答案: 分离实体是状态不能由JPA提供程序反映的实体。 换句话说,如果您更改其状态(即通过setter方法),则这些更改将不会保存到基础数据库中,因为JPA提供程序不必“观察”此类实体。 如果实体E1是受管实体,则可以使其分离调用(非常合理的命名)方法。您还可以使用它将清除整个PersistenceContext并有

  • 我目前的项目是用JavaFX完成的。我使用属性将(双向)视图字段绑定到bean(使用JFXtras的BeanPathAdapter)。 我选择用JPA和ObjectDB作为模型。 这是我第一次在独立的项目中使用JPA,这里我面临的是托管实体的问题。 实际上,我将托管实体绑定到视图字段,当视图字段的值更改时,实体会更新...和数据库也是如此。 我正在尝试找到一种手动保存/合并实体的方法,以便我可以询

  • 问题内容: 下面给出从到的一对多关系。 部门(家长): 员工(孩子): 合并如下所示的托管实体(子实体)(在EJB中使用CMT), 不会更新数据库表中的相应员工行。仅当从中的子关系中删除时,才会发生这种情况。 为什么表中的行没有更新?关于此示例的唯一目的是什么? 我当前正在使用具有JPA 2.1的EclipseLink 2.6.0。 问题答案: 级联应该始终从父级传播到子级,而不是相反。 在您的情

  • 了解如何配置WAS或OpenJPA,以便通过容器管理的实体管理器使用容器管理的身份验证。 试图通过在JNDI中注册为“JDBC/DB2”(指Oracle)的JDBC数据源访问Oracle数据库,该数据源在persistence.xml中定义。 persistence.xml 但是,当访问持久性单元的容器管理实体管理器时,会抛出ORA-01017无效的usrname/password。如果在pers

  • 托管 本页告诉你如何在自己的服务器上托管 .crx文件。如果你仅仅通过Chrome Web Store发布扩展,应用,或者主题那么你不需要本页。取而代之的是查阅Chrome Web Store帮助和开发者文档。 注意:如果你已经把扩展发布到扩展库,扩展就会合并到Chrome Web Store里。 按照惯例, 无论是Chrome Web Store还是特定服务器所提供的扩展, 可安装的web ap

  • 主要内容:实例,运行测试结果以下代码显示了如何进行bean注入。 我们先定义一个消息bean,它有一个字符串属性来存储消息。 然后我们再定义另一个托管bean,并使用注解注入。 实例 打开 NetBean8.2,创建一个名为: InjectManagedBeans 的工程,并加入以下文件代码。 以下是文件:UserBean.java 中的代码 - 以下是是文件:index.xhtml 中的代码 - 以下是文件:Message