【发布时间】:2020-10-08 10:15:45
【问题描述】:
Bank.java
@Stateless
@Local
public class Bank implements IBank {
@EJB
IConfigBean iConfigBean;
@EJB
IDbs iDBS;
@EJB
IPosb iPosb;
@Override
public void doTransaction() {
System.out.println("--Bank Transaction Started--");
try {
Config config1 = getConfig(1);
iConfigBean.create(config1);
iDBS.doDBSTransaction();
Config config3 = getConfig(3);
iConfigBean.create(config3);
iPosb.doPOSBTransaction();
Config config5 = getConfig(5);
iConfigBean.create(config5);
} catch (Exception e) {
e.printStackTrace();
System.out.println("---Bank Exception--");
}
System.out.println("--Bank Transaction End--");
}
@Override
public Config getConfig(int inserttionOrderNo) {
Config config = new Config();
config.setType("EJBTransactionTESTING - " + inserttionOrderNo);
return config;
}
}
DBS.java
@Stateless
@Local
public class DBS implements IDbs {
@EJB
IConfigBean iConfigBean;
@Override
public void doDBSTransaction() {
System.out.println("--DBS Transaction Started--");
try {
Config config2 = getConfig(2);
iConfigBean.create(config2);
} catch (Exception e) {
e.printStackTrace();
System.out.println("--DBS Exception--");
}
System.out.println("--DBS Transaction End--");
}
@Override
public Config getConfig(int inserttionOrderNo) {
Config config = new Config();
config.setType("EJBTransactionTESTING - " + inserttionOrderNo);
return config;
}
}
POSB.java
@Stateless
@Local
public class POSB implements IPosb {
@EJB
IConfigBean iConfigBean;
@Override
public void doPOSBTransaction() {
System.out.println("--POSB Transaction Started--");
try {
Config config4 = getConfig(4);
iConfigBean.create(config4);
if (true) {
//For Test 1
//throw new NullPointerException();
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("--POSB Exception--");
}
if (true) {
//For Test 2
// throw new NullPointerException();
}
System.out.println("--POSB Transaction End--");
}
@Override
public Config getConfig(int inserttionOrderNo) {
Config config = new Config();
config.setType("EJBTransactionTESTING - " + inserttionOrderNo);
return config;
}
}
我是 Stack Overflow 的新手,这是我的新问题,如果我错了,请纠正我。
环境是..
- Windows 10
- Java 1.8
- 日食
- Tomcat 8.5
- EJB3
我有三个无状态bean,请看Transaction流的Sequence Diagram。
我在交易过程中故意在两个地方制作了 NullPointer Exception 以了解区别,并在序列图中用 Lightening Bold 符号标记。
我没有对任何方法使用任何@TransactionAttribute。
测试 1 - try 块内的空指针(带绿色的闪电粗体符号) 当我开始测试时,出现空指针异常并且所有事务都没有标记为回滚,并且数据也被插入到数据库中。
我只能在控制台日志中看到空指针异常。
测试 2 - 在 try - catch 方法之外的空指针(带红色的闪电粗体符号) 当我开始测试时,得到空指针异常加上 EJBTransactionRolledbackException 和所有标记为回滚的事务并且没有数据插入到数据库中。
我可以在控制台日志中看到 NullPointer 和 EJBTransactionRolledback 异常。
这里的问题是,
- 如果我在 try 块中创建了 Null 指针,为什么 EJB 事务没有标记为回滚
- 如果我在 try 块之外创建了空指针,为什么会发生 EJB 事务回滚
提前致谢。
【问题讨论】:
标签: java jpa ejb ejb-3.0 openjpa