即使我在update()方法中抛出空指针异常,以下代码也无助于回滚。如果我运行代码,每次它都会将值插入数据库。如果在update()方法中抛出空指针,请帮助我如何回滚事务。我在代码中遗漏了什么吗?
@TransactionManagement(value = TransactionManagementType.CONTAINER)
public class Bean implements RemoteIF {
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void insertIntoDb() {
insert();
update();
}
private Integer update() {
val=0;
try {
Connection con = DbConn.getConnection();
Statement st = con.createStatement();
val1 = st.executeUpdate("INSERT INTO tab VALUES('ab')");
st.close();
throw new NullPointerException();
} catch (Exception e) {
System.out.println(e);
}
return val;
}
private Integer insert() {
int val = 0;
try {
Connection con = DbConn.getConnection();
Statement st = con.createStatement();
val = st.executeUpdate("INSERT INTO tab VALUES('bnm')");
st.close();
} catch (Exception e) {
System.out.println(e);
}
return val;
}
}
答案 0 :(得分:0)
对我怀疑的事情很可疑。
@Stateless
课程中没有@Stateful
,@Singleton
或Bean
注释。除非您在ejb-jar.xml
文件中声明了bean,否则这不会被识别为EJB。绝对要仔细检查一下。
DbConn.getConnection()
看起来很可疑,您可能正在尝试自己管理数据库连接。如果您有任何使用DriverManager
或new FooDataSource()
的代码,那肯定是问题所在。如果您希望事务管理工作,您必须通过
@Resource DataSource datasource
字段注入java:comp/env/yourDataSource
的JNDI查找,其中yourDataSource
是您在ejb-jar.xml中配置或通过使用@Resource(type=DataSource.class, name="youDataSource")
在bean类上声明的数据源的名称 - 该注释继续上课而不是方法或领域。有关交易管理如何运作的一些见解,请参阅这些答案: