JBoss中EclipseLink未生成Oracle写操作SQL的配置咨询
JBoss EAP 7.4 + EclipseLink 2.7 写操作SQL生成问题排查与配置
1. 检查UnitOfWork的提交逻辑
TopLink/EclipseLink的UnitOfWork需要显式调用commit()才会触发写操作SQL生成,你的代码可能缺少这关键一步:
UnitOfWork uow = session.acquireUnitOfWork(); uow.deleteObject(employeeSmith); uow.commit(); // 必须调用此方法才会执行DELETE SQL
原OC4j环境可能存在隐式提交机制,但JBoss下EclipseLink要求显式提交UnitOfWork,否则所有写操作只会在内存中暂存,不会同步到数据库。
2. 调整sessions.xml核心配置
事务模式匹配
根据你的事务类型(JDBC本地事务/容器管理事务),在<session>节点下配置对应模式:
<session> <!-- 本地JDBC事务用此配置 --> <transaction-mode>JDBC</transaction-mode> <!-- 容器管理事务(CMT)用此配置 --> <!-- <transaction-mode>Container</transaction-mode> --> <!-- 开启日志排查事务触发情况 --> <logging> <log-level>FINE</log-level> <log-output>console</log-output> </logging> </session>
数据源与事务同步配置
确保EclipseLink使用JBoss管理的数据源,并开启容器事务同步:
<session> <login> <connection-pool> <jndi-datasource-name>java:/你的Oracle数据源JNDI名</jndi-datasource-name> </connection-pool> </login> <!-- 适配JBoss容器事务 --> <property name="eclipselink.target-server" value="JBoss"/> <property name="eclipselink.transaction.join-existing" value="true"/> </session>
3. JBoss EAP数据源配置检查
在standalone.xml/domain.xml中确保数据源支持事务,配置示例:
<datasource jndi-name="java:/OracleDS" pool-name="OracleDS" enabled="true"> <connection-url>jdbc:oracle:thin:@//host:port/service</connection-url> <driver>oracle</driver> <security> <user-name>数据库用户名</user-name> <password>数据库密码</password> </security> <validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/> <validate-on-match>true</validate-on-match> </validation> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> </datasource>
4. 实体映射文件验证
检查实体映射的修改追踪配置,确保未关闭自动修改检测:
<entity class="Employee"> <table name="employee"/> <!-- 启用属性级修改追踪,默认开启,若手动关闭需重新开启 --> <change-tracking type="ATTRIBUTE"/> </entity>
另外,确保写操作的实体对象是当前Session/UnitOfWork管理的实例(比如从session.executeQuery查询得到的对象),离线对象需先调用registerObject再执行写操作。
内容的提问来源于stack exchange,提问作者JoeSat
相关产品推荐
相关产品推荐

