【问题标题】:IllegalArgumentException: Entity must be managed to call removeIllegalArgumentException:必须管理实体以调用删除
【发布时间】:2014-03-24 07:02:33
【问题描述】:

控制器页面有以下代码

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

TransactionFactory

    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;
    }
}

empEmp 类型的变量名。

        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();

但是,得到以下异常,它指向上面的代码。

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

【问题讨论】:

  • 您的 manager.merge() 方法可能没有返回正确的 Emp 实例。
  • 所以。如何解决这个问题?
  • 我已经通过输入System.out.println(ref.getEname()); 验证了参考,它返回了正确的员工姓名
  • 如果未知管理器类的每个方法都打开并关闭会话,则该方法一返回,实体就会变为非托管。你为什么不显示你的代码?
  • @JBNizet 代码已添加。而getManager() 将返回EntityManager 实例;

标签: java jpa transactions ejb illegalargumentexception


【解决方案1】:

正如@JBNizet 建议的那样

我只创建一次EntityManagerFactory 的实例,方法是放入私有构造函数并通过此类的getter 方法检索实例。

为了删除实体,我使用了以下代码

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

而且,它有效。!!

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 2015-06-28
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    相关资源
    最近更新 更多