【发布时间】:2012-02-18 07:48:17
【问题描述】:
在使用容器管理实体 bean 时,容器何时将 bean 存储到数据库中? 这可以在 servlet 内部使用一些代码语句进行控制,还是容器在内部自动管理?
【问题讨论】:
-
您说的是 JPA 实体,还是旧的 EJB2 实体 bean?
标签: java jakarta-ee entity containers
在使用容器管理实体 bean 时,容器何时将 bean 存储到数据库中? 这可以在 servlet 内部使用一些代码语句进行控制,还是容器在内部自动管理?
【问题讨论】:
标签: java jakarta-ee entity containers
基本上,当您提交事务时,它会存储到数据库中。
使用 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 角度看来递归的事情实际上可能以“线性”方式在数据库中发生。但是,在大多数情况下,结果是相同的。
考虑事务隔离级别也可能是相关的。
【讨论】:
保证事务提交时bean的状态会保存到数据库中。通常,容器会等到提交时间再保存状态,以避免在事务回滚或在单个事务中多次修改状态时进行不必要的更新。
规范还说,容器必须确保对实体 bean 所做的修改对于在同一事务中执行的 EJBQL 查询是可见的。这意味着在执行 EJBQL 查找器之前将修改保存到数据库中。
【讨论】: