作者cyclone350 (老子我最神)
看板java
标题Re: [J2EE] JPA JTA
时间Wed Aug 5 01:10:51 2015
※ 引述《luoqr (.....)》之铭言:
我在写某个专案也很奇怪
只要 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 我不能理解阿,有人能解释吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.193.192.133
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1438708254.A.153.html
1F:推 luoqr: 1.entity处於managed状态 只要有异动就会反应到db 08/05 07:45
2F:→ luoqr: 2.资讯不足无法判断 XD 08/05 07:46
我也有查到相关资讯
但是我不太能理解,既然这样何必用 update 或 save ...
根本是 虚有其表的 method...
我在另一个专案,不会自动更新 entity,必须要 save 或 update 才可以
我也认为这样比较合理 @@
※ 编辑: cyclone350 (123.193.192.133), 08/05/2015 08:05:35
3F:→ swpoker: 主要还是"同步的时机点",同步次数过多是没有必要的 08/05 10:24
4F:→ swpoker: 同步基本就是交易范围最後的时间点才会做 08/05 10:25
5F:→ swpoker: 照你的例子,交易范围超过你的程式范围 08/05 10:26
6F:→ swpoker: 你要限制交易的范围在哪 08/05 10:26
回 swpoker,交易范围是挂在 test1() 里面 (是用 spring 的 proxy 做 transaction)
所以我觉得很奇怪...
7F:推 phstudy: 1.是container managed persistence才会有这种现象 08/05 15:56
8F:→ phstudy: application managed persistence就要自己处理了 08/05 15:56
同样 framework (spring + hibernate) 及 server (tomcat) 的专案
一个需要 update 才会 commit,一个会自动 commit...
phstudy 说的 container 是指 server 吗?
我没有去详细观察两个专案的设定,会觉得奇怪是因为没特别注意就不会发现...
(当你看到大家专案都用 save 来处理 entity 时,
就会自然而然地认为要用 save 才是存入 DB)
有时间再去看设定找原因,到时候再把结果 post 出来 XD
※ 编辑: cyclone350 (123.193.192.133), 08/05/2015 21:25:31
9F:推 phstudy: 如果不知道CMP跟AMP差别,建议你去读JSR338 7.6~7.8 08/05 23:00
10F:→ phstudy: 这里的container是指JEE container 08/05 23:01
11F:→ phstudy: 标准的tomcat不是JEE container, TomEE就另当别论了 08/05 23:02
12F:→ phstudy: 标准的Tomcat是不支援CMP的 08/05 23:04
13F:→ phstudy: 另外也可以用AOP去做出类似CMP的行为 08/05 23:05
14F:推 asship: 请问是使用什麽资料库呢? oracle预设会commit 08/07 23:24
15F:→ asship: datasource使用apache的dbcp的话,预设是auto commit 08/07 23:25
16F:推 asship: oracle的ucp.jar也是如此 08/07 23:28
17F:→ asship: c3p0会帮忙rollback 08/07 23:28