大约一周后,我对 EJB CMT 失去理智并且找不到解决方案!任何启示将不胜感激......
我只是想创建一个 CMT EJB,做一些成功的数据库操作,最后一个失败(SQLException)。我希望回滚所有操作,但它没有发生......
我的环境:
- MySQL 5.5
- 玻璃鱼 3.0.1
- 休眠
我的 EJB:
@Stateless(name = "UpdaterFacade", mappedName = "ejb/UpdaterFacade")
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@Interceptors(DefaultFacadeInterceptor.class)
public class UpdaterFacade implements UpdaterFacadeRemote {
@Resource
private EJBContext context;
@PersistenceContext(name = "EJB3DS")
private EntityManager em;
@Override
public void updatePluginDatabase() throws Exception {
try {
em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '0' WHERE `property` = 'CMTTest';").executeUpdate();
em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '1' WHERE `property` = 'CMTTest';").executeUpdate();
em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '2' WHERE `property` = 'CMTTest';").executeUpdate();
em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '3' WHERE `property` = 'CMTTest';").executeUpdate();
em.createNativeQuery("ALTER TABLE `itemprices` DROP FOREIGN KEY `fk_itemprices_itemcodes1`;").executeUpdate();
em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '4' WHERE `property` = 'CMTTest';").executeUpdate();
em.createNativeQuery("RENAME TABLE `foo` TO `noo`;").executeUpdate();
} catch (Exception e) {
// throw new DatabaseCriticalException("ERP_000048", null, e);
context.setRollbackOnly();
}
}
}
除了我尝试重命名不存在的表'foo'的最后一行之外,代码执行成功。所以注入、SQL 连接、数据库正在工作(可能配置错误)。
我注意到在逐行调试时(并与另一个程序逐行查询数据库),在“DROP FOREIGN”语句之前,表中没有任何更改,之后,之前的语句被提交(其他连接/程序可见) . 在它到达方法的尽头之前!
当 EJB 返回时,我的“CMTTest”属性值为 '8',并且我的 FOREING KEY 被丢弃,没有任何东西是 RolledBack... =\
我已经尝试用“@ApplicationException(rollback = true)”抛出异常,后来我改为显式调用“setRollbackOnly()”没有任何效果......其实我不相信这是问题,否则什么都不会在 EJB 结束之前提交它就结束了。不知何故,我在配置中失败了。也许某种 CMT 上的自动提交?看起来很绝望的疯子...
我的persistence.xml
<persistence-unit name="EJB3DS" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/ERPDS</jta-data-source>
<jar-file>CoreClient.jar</jar-file>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
我的 GlassFish 池配置为:
编辑 JDBC 连接池
编辑 JDBC 连接池高级属性
编辑 JDBC 连接池属性
不知道还有什么重要的说!只是提前感谢任何帮助或提示...
如果我自己找到答案,我会回来发布答案,但现在我完全迷路了!
谢谢你们..