Re: [J2EE] JPA JTA

楼主: phstudy (study)   2015-08-06 08:56:24
回一下save与update的问题
首先,我必须说JPA里面没有定义这两个method
JPA只有persist与merge (底层实作可以是Hibernate的save与update)
- persist(Object entity)
Make an instance managed and persistent.
- merge(T entity)
Merge the state of the given entity into the current persistence context.
前面luoqr已经有提到:“entity处于managed状态 只要有异动就会反应到db”
这点可以在spec 3.2.4找到。然后搭配JTA EM, 会让人觉得只是改entity连commit也没有,
异动就通通进数据库的错觉。
顺便补充JPA entity的life cycle
1. A new entity instance has no persistent identity,
and is not yet associated with a persistence context.
2. A managed entity instance is an instance with a persistent identity
that is currently associated with a persistence context.
3. A detached entity instance is an instance with a persistent identity
that is not (or no longer) associated with a persistence context.
4. A removed entity instance is an instance with a persistent identity,
associated with a persis- tence context, that will be removed from
the database upon transaction commit.
结论:
1. persist的使用时机, 当你新增了一个物件(new entity instance),
要把他变成managed entity并存入db时必须使用
2. 当entity状态变成detached时, 可以透过merge把它变成managed entity.
如果对detached entity用persist, 可能会炸EntityExistsException的例外
更细节的定义与行为可以在spec的下面章节找到
persist: 3.2.2
merge: 3.2.7.1
※ 引述《phstudy (study)》之铭言:
: 刚刚重新看了Spec, 发现我的回文也不太准确...
: spec在这里: https://jcp.org/en/jsr/detail?id=338
: 准确来说是这样
: EM的部分
: 1. Container Managed(CM) EM必须是JTA EM
: 2. Application Managed(AM) EM可以是JTA EM或resource-local EM
: Container的部分
: 1. JEE Container支援JTA EM与resource-local EM, 可以在JEE Container中使用CM与AM
: 2. 非JEE Container支援JTA EM与resource-local EM, 但只能使用AM
: 所以这种method结束后会自动commit的行为是JTA EM造成的 XD
: ※ 引述《cyclone350 (老子我最神)》之铭言:
: : 我在写某个专案也很奇怪
: : 只要 entity 有异动到,就算不做 save or update 等方法
: : transaction 结束后会把全部的异动 commit 到 DB 里面...
: : 还有一个就是
: : 若 entity constraint 设定若跟 DB 不符,
: : save 当下不会出错,transaction 结束后才会出错
: : 但是包在 transaction 外层的 code block 并不会接到 exception...
: : 像这样
: : try {
: : test1();
: : log.info("完成");
: : } catch(Exception e) {
: : log.error("出现错误")
: : }
: : 就算 test1 出错 (transaction 挂 test1),仍会 log 出 "完成"
: : 这两个 case 我不能理解阿,有人能解释吗?
作者: luoqr (.....)   2015-08-08 09:46:00
哈 我没说清楚,意思就是指交易正常commit状况下 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com