Tha*_*ham 11 java orm ejb jpa java-ee
我知道我必须在删除它之前合并该实体,但我从未想过我必须在EJB中执行它.首先我有这些:
e = (Event) scholarBean.merge(e);
scholarBean.remove(e);
Run Code Online (Sandbox Code Playgroud)
在我的托管bean中.它给了我这个错误
java.lang.IllegalArgumentException: Entity must be managed to call remove: com.scholar.entity.Event@998, try merging the detached and try the remove again.
Run Code Online (Sandbox Code Playgroud)
那么我将这两行放在我的会话bean中,它就可以了.知道为什么吗?
Managed Bean
myEJB.deleteEvent(e);
Run Code Online (Sandbox Code Playgroud)
和
myEJB.java
public void deleteEvent(Event e){
e = (Event) merge(e);
em.remove(e);
}
Run Code Online (Sandbox Code Playgroud)
Pas*_*ent 17
我知道我必须在删除它之前合并该实体
不完全是.传递给remove的对象必须是一个实体,不能分离.那不一样.
但我从没想过我必须在EJB内部做这件事.首先,我有这些(...)
让我们看看你在做什么:
1: e = (Event) scholarBean.merge(e);
2: scholarBean.remove(e);
Run Code Online (Sandbox Code Playgroud)
因此1:,您可以调用EJB(很可能使用事务范围的持久性上下文)来合并实体.但随后方法结束,事务提交,持久化上下文被关闭,使得返回的实体再次分离.
然后2:,您将(仍然)分离的实体传递给EJB并尝试remove它,这是不允许的.还有KaBOOM!
那么我将这两行放在我的会话bean中,它就可以了.知道为什么吗?
它的工作原理是因为您现在正在与JTA事务关联的持久性上下文的范围内工作,因此您实际上是将托管实体传递给remove.
小智 7
......你甚至可以把它们结合起来:
像这样:
public void deleteManCheck(ManCheck manCheck) {
em.remove(em.merge(manCheck));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10277 次 |
| 最近记录: |