在使用容器管理的实体bean时,容器是否将bean存储到数据库? 可以使用一些代码语句在servlet中控制它,还是容器在内部自动管理它?
答案 0 :(得分:1)
保证在提交事务时将bean状态保存到数据库中。通常,容器将在保存状态之前等待提交时间,以避免在事务回滚时进行不必要的更新,或者在单个事务中多次修改状态。
规范还说容器必须确保在同一事务中执行的EJBQL查看对实体bean的修改是可见的。这意味着在执行EJBQL查找器之前,修改将保存到数据库中。
答案 1 :(得分:1)
基本上,在提交事务时,它会存储到数据库中。
使用CMP,您可以在deplyment描述符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
的摘录当你在ejb上调用一个方法时,容器可以启动一个新的事务,具体取决于你的分界,如果方法成功终止,那么事务可能会被提交,具体取决于这个和那个。例如,如果您的特定方法使用requires-new进行划分,则将提交,因为它具有自己的事务,但是如果它使用requires划分,并且在一个正在运行的事务中被调用(对于实例,因为它是从一个会话bean方法调用的,例如,需要或要求新的),它将在提交该封闭事务时提交。或者如果失败,不仅会回滚在该方法中所做的更改,而且还会在封闭方法调用/事务中进行更改。
虽然部署描述符可能允许嵌套事务,但它实际上归结为数据库引擎最终如何处理事务。通常rdbms并不真正支持嵌套事务,而是使用事务保存点,因此从ejb-perspective出现的递归实际上可能在数据库中以“线性”方式发生。但在大多数情况下,结果都是一样的。
考虑事务隔离级别也可能是相关的。