java J2EE JTA事务回滚不适用于OSE Glassfish 4.0(Build 89)
我是J2EE新手,希望使用容器管理的事务。我的问题是,当我在一个长时间运行的任务中关闭服务器时,应该是事务性的,所有已经处理的数据都将提交。我做错了什么?这难道不应该倒退吗?看起来EntityManager会在服务器关闭时刷新所有内容,即使该功能尚未完成
使用的服务器和技术
- Glassfish 4.0(Build 89)
- 日食
- 泽西
- EJB
EJB示例类
@Stateless
@RequestScoped
@Path("/companys")
public class CompanysResource {
@SuppressWarnings("unused")
private static final Logger mLogger = LoggerFactory
.getLogger(CompanysResource.class);
@HeaderParam(UserSession.SESSION_NAME)
private String mSessionId;
@Context
private ResourceContext mResourceContext;
@Context
private UriInfo mUriInfo;
@PersistenceContext(unitName = PersistenceUtils.PERSISTENCE_UNIT)
private EntityManager mEntityManager;
private CompanyService mCompanyService;
public CompanysResource() {
...
}
@PostConstruct
public void initServices() {
mCompanyService = new CompanyService(mEntityManager);
}
@POST
@Consumes(MediaType.APPLICATION_XML)
public Response create(CompanyDTO companyDTO) {
UserSession userSession = UserSessionService
.getValidUserSessionBySessionId(mEntityManager, mSessionId);
//***************************************************
//Long running example!
//Server shutting down before leaving the persist function
//***************************************************
Company company = mCompanyService.persist(userSession, companyDTO);
// Create URI
UriBuilder absolutePathBuilder = mUriInfo.getAbsolutePathBuilder();
URI createdURI = absolutePathBuilder.path(company.getId().toString())
.build();
return Response.created(createdURI).build();
}
//...
}
坚持。xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="ILVPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<!-- Tomcat Datasource -->
<!-- <non-jta-data-source>java:/comp/env/jdbc/prego_ilvDS</non-jta-data-source> -->
<!-- <jta-data-source>java:/comp/env/jdbc/prego_ilvDS</jta-data-source> -->
<!-- Glassfish Datasource -->
<!-- <non-jta-data-source>jdbc/prego_ilvDS</non-jta-data-source> -->
<jta-data-source>jdbc/prego_ilvDS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<!-- Shared Cache Enable/Disable -->
<property name="eclipselink.cache.shared.default" value="false"/>
<!-- Statement caching -->
<property name="eclipselink.jdbc.cache-statements" value="true" />
<!-- Batch writing -->
<!--
<property name="eclipselink.jdbc.batch-writing" value="JDBC" />
<property name="eclipselink.jdbc.batch-writing.size" value="1000" />
-->
<!-- Close EntityManager on commit, to avoid cost of resume -->
<!-- <property name="eclipselink.persistence-context.close-on-commit" value="true" /> -->
<!-- Avoid auto flush cost on query execution -->
<!--
<property name="eclipselink.persistence-context.flush-mode" value="commit" />
<property name="eclipselink.persistence-context.reference-mode" value="WEAK"/>
-->
<!-- Avoid cost of persist on commit -->
<!-- <property name="eclipselink.persistence-context.persist-on-commit" value="false" /> -->
<!-- EclipseLink JPA Debug Logging -->
<!-- Turn Logging Off -->
<!-- <property name="eclipselink.logging.level" value="off" /> -->
<property name="javax.persistence.logging.level" value="INFO"/>
<!-- -->
<property name="eclipselink.logging.level.sql" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
<!-- -->
</properties>
</persistence-unit>
</persistence>
感谢您的帮助
# 1 楼答案
确保使用@Transactional annotation对服务方法进行了注释。没有它,内部的数据库操作不会在一个事务中执行,而是使用autocommit。 还可以在类上使用@Transactional注释。这与在每种方法上使用相同。 希望有帮助