【问题标题】:While using container managed entity bean when is the bean stored to database by the container?在使用容器托管实体 bean 时,容器何时将 bean 存储到数据库中?
【发布时间】:2012-02-18 07:48:17
【问题描述】:

在使用容器管理实体 bean 时,容器何时将 bean 存储到数据库中? 这可以在 servlet 内部使用一些代码语句进行控制,还是容器在内部自动管理?

【问题讨论】:

  • 您说的是 JPA 实体,还是旧的 EJB2 实体 bean?

标签: java jakarta-ee entity containers


【解决方案1】:

基本上,当您提交事务时,它会存储到数据库中。

使用 CMP,您可以通过部署描述符 a'la 中的事务划分来控制这一点

<ejb-jar>
...
<assembly-descriptor>
...
<container-transaction>
<method>
<ejb-name>EmployeeRecord</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction>
<method>
<ejb-name>EmployeeRecord</ejb-name>
<method-name>updatePhoneNumber</method-name>
</method>
<trans-attribute>Mandatory</trans-attribute>
</container-transaction>
...

这是来自规范 http://download.oracle.com/otn-pub/jcp/ejb-2.1-fr-spec-oth-JSpec/ejb-2_1-fr-spec.pdf 的 sn-p

当您在 ejb 上调用方法时,容器可能会启动新事务,具体取决于您的分界,如果方法成功终止,则可能会提交事务,具体取决于此和那个。例如,如果您的特定方法是用 requires-new 划分的,它被提交,因为它有自己的事务,但如果它是用 requires 划分的,并且在一个正在运行的事务中被调用(例如实例,因为它是从一个会话 bean 方法中调用的,例如,requires 或 requires-new),它将在提交该封闭事务时提交。或者如果失败,不仅该方法内部所做的更改将被回滚,而且封闭方法调用/事务内部所做的更改也将回滚。

虽然部署描述符可能允许嵌套事务,但它实际上归结为数据库引擎最终如何处理事务。很多时候,rdbms 并不真正支持嵌套事务,而是使用事务保存点,因此从 ejb 角度看来递归的事情实际上可能以“线性”方式在数据库中发生。但是,在大多数情况下,结果是相同的。

考虑事务隔离级别也可能是相关的。

【讨论】:

  • 如果服务器在事务提交之前崩溃,实体状态会丢失吗?
  • @seahorse 是的,除非它存储在其他地方。来自规范(再次):如果在容器崩溃时某个事务正在更新实体的状态,则该实体的状态会自动重置为最后提交的事务的状态。
【解决方案2】:

保证事务提交时bean的状态会保存到数据库中。通常,容器会等到提交时间再保存状态,以避免在事务回滚或在单个事务中多次修改状态时进行不必要的更新。

规范还说,容器必须确保对实体 bean 所做的修改对于在同一事务中执行的 EJBQL 查询是可见的。这意味着在执行 EJBQL 查找器之前将修改保存到数据库中。

【讨论】:

  • 如果查询在与更改相同的会话/连接中运行,则即使更新尚未提交,它们对该查询也是可见的。在该会话/事务之外可见的内容取决于事务隔离级别。
猜你喜欢
  • 2011-06-11
  • 2012-01-17
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
相关资源
最近更新 更多