在我们的J2EE应用程序中,我们使用EJB-3有状态bean来允许前端代码创建,修改和保存持久性实体(通过JPA-2管理)。
看起来像这样:
@LocalBean
@Stateful
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEntityController implements Serializable
{
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
private MyEntity current;
public void create()
{
this.current = new MyEntity();
em.persist(this.current);
}
public void load(Long id)
{
this.current = em.find(MyEntity.class, id);
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void save()
{
em.flush();
}
}
非常重要的是,为了避免过早提交,只有save()
方法位于事务内,因此,如果调用create()
,则不会在数据库中插入任何内容。
奇怪的是,在save()
方法中,我们必须调用em.flush()
才能真正访问数据库。实际上,我尝试过发现,我们也可以调用em.isOpen()
或em.getFlushMode()
,以及与“
em有关”的任何东西。
我不明白这一点。与save()
事务中的情况一样,我认为在方法结束时将提交事务,因此持久性实体管理器会自动刷新。为什么我必须手动冲洗它?
谢谢,Xavier
是直接和金属,不会有javax.transaction.Synchronization
问题登记EntityManager的对象,直到你真正 使用
它 的 交易。
我们在app-server-
land中将创建这些对象之一来执行flush()
并将其注册到javax.transaction.TransactionSynchronizationRegistry
或javax.transaction.Transaction
。除非有活动的交易,否则无法完成此操作。
这就是它的长短。
是的,应用服务器可以很好地保存它提供给有状态Bean的资源列表,并自动将其注册到有状态Bean可能启动或参与的每个事务中。其缺点是,您完全失去了决定执行哪些操作的能力在其中进行交易。也许您有2或3个不同的事务要在不同的持久性单元上运行,并在扩展持久性上下文中汇总非常特定的事务的工作。这实际上是一个设计问题,应用服务器应将此类决策留给应用本身。
您在交易中使用它,我们将其注册在交易中。那是基本合同。
旁注,根据底层EntityManager的处理方式,对EntityManager的 任何 持久调用都 可能
足以在事务结束时引起完全刷新。当然,这flush()
是最直接,最明确的方法,但一个persist()
甚至一个find()
都可以。
C++20概念的一个特点是,在某些情况下,您必须编写。例如,[expr.prim.req]/3中的这个示例:
问题内容: 有时,当我重写方法时,在第一次调用时会出现异常,如下所示: 为什么我们被迫打电话?父类有义务是有意义的,但是更重要的是,我们如何知道需要调用一个方法,而不是等待它崩溃? 问题答案: 为什么我们被迫调用super.method()? 组成Android SDK的类非常复杂。例如,活动和片段都必须执行许多操作才能正常运行(即管理生命周期,优化内存使用,在屏幕上绘制布局等)。要求客户端调用基
问题内容: 例如,我的CRUD界面中有一个方法可以从数据库中删除用户: 此方法仅适用于注释@Modifying。但是这里需要注释吗?为什么Spring无法分析查询并理解它是一个修改查询? 问题答案: 这将触发注释为方法的查询,作为更新查询而不是选择查询。由于执行修改查询后EntityManager可能包含过时的实体,因此我们会自动清除它(有关详细信息,请参阅EntityManager.clear(
在Java,如果我们运行: 它将抛出: 但是,在php中,如果我们运行: 它将打印%1。 我怀疑这是否是因为Java是强类型语言,而php是弱类型语言。能不能有人给出一个更深层次、更低层次的解释?
问题内容: 我创建了一个用于显示工具提示的指令: 对应功能: 应用于此: 这是我观点的一部分,由拥有者的控制器处理 为什么必须调用才能将更改应用到,该更改是早先声明和初始化的? 问题答案: 因为附加到事件的回调超出了angular的范围;angular不知道该函数何时运行/结束,因此摘要循环永远不会运行。 调用或告诉angular更新绑定并触发任何手表。