【发布时间】: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