IllegalArgumentException:实体必须被管理才能调用remove [英] IllegalArgumentException: Entity must be managed to call remove

查看:308
本文介绍了IllegalArgumentException:实体必须被管理才能调用remove的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

控制器页面具有以下代码

Controller page has following code

                BigDecimal id=new BigDecimal(request.getParameter("empId"));
                employee.setEmpno(id);
                flag = factory.removeEmployee(employee);

TransactionFactory class

    public final class EntityTransactionFactory implements TransactionFactory{

    @PersistenceContext
    private EntityManagerFactory Factory;
    private EntityManager Manager;
    @Resource
    private UserTransaction Transaction;
    private static final TransactionFactory transaction = new EntityTransactionFactory();

    private EntityTransactionFactory() {

    }

    public static TransactionFactory getInstance() {
        return transaction;
    }


    /**
     * @return the Factory
     */
    @Override
    public EntityManagerFactory getFactory() {
        Factory= Persistence.createEntityManagerFactory("SampleBeanPU");
        return Factory;
    }

    /**
     * @return the Manager
     */
    @Override
    public EntityManager getManager() {
        Manager=getFactory().createEntityManager();
        return Manager;
    }

    /**
     * @return the Transaction
     */
    @Override
    public UserTransaction getTransaction() {
        try {
            Transaction = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
        } catch (NamingException e) {
            Transaction=null;
        }
        return Transaction;
    }
}

emp 变量名称 Emp 类型。

        TransactionFactory factory=EntityTransactionFactory.getInstance();
        factory.getTransaction().begin();
        factory.getManager().joinTransaction();

        Emp ref= factory.getManager().getReference(Emp.class, emp.getEmpno());
        System.out.println(ref.getEname());
        factory.getManager().remove(factory.getManager().merge(ref));
        System.out.println(factory.getTransaction().getStatus());
        factory.getTransaction().commit();
        System.out.println(factory.getTransaction().getStatus());
        //factory.getManager().flush();
        factory.getManager().close();
        factory.getFactory().close();

但是,获取以下异常,指向上面的代码。

But, getting following exception, which is pointing on above code.

 java.lang.IllegalArgumentException: Entity must be managed to call remove: com.entity.Emp[ empno=1234 ], try merging the detached and try the remove again.


推荐答案

根据@JBNizet的建议

As suggested by @JBNizet

我通过放入私有构造函数和通过此类的getter方法检索实例,仅创建一个 EntityManagerFactory 的实例。

I'm creating instance of EntityManagerFactory only once by putting into private constructor and retrieving instance by getter method of this class.

对于删除实体,我使用以下代码

And for removing entity I used following code

        Emp ref = factory.getManager().find(Emp.class, emp.getEmpno());           
        factory.getManager().remove(ref);

而且,它有效!!

这篇关于IllegalArgumentException:实体必须被管理才能调用remove的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆