[英]How to use Container Managed Transaction (CMT) with JBoss AS 6, Hibernate 3.6, JPA, JTA and EJB3
[英]Embedding liquibase inside JBoss EJB JPA JTA environment
我將liquibase嵌入服務器中,因此我們甚至可以在數據庫啟動之前就數據庫中的同步問題向用戶發出警告。
我們要做的是從entityManager獲得連接。
EntityManagerFactory emf = entityManager.getEntityManagerFactory();
DataSource currentDatasource = (DataSource) emf.getProperties().get("hibernate.connection.datasource");
try {
connection = currentDatasource.getConnection();
} catch (SQLException e) {
....
}
然后用它喂Liquibase。 (我們首先獲得數據庫對象)
Liquibase liquibase = new Liquibase("postgresql-master-changelog.xml", new CompositeResourceAccessor(clFO, fsFO, threadClFO), database);
liquibase.reportStatus(true, "", new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out))));
現在的問題是,它似乎開始起作用,但是我們得到了
You cannot rollback during a managed transaction!
因此,我們不知道該怎么做。 唯一的選擇是在沒有JTA管理的情況下創建新的全新連接。 但是,我們該怎么做呢?
還有其他選擇嗎?
先感謝您。
由於發布日期的原因,我認為這是一個“難題”,但是幾分鍾前,我試圖處理WildFly 10中單例會話bean的Liquibase時就遇到了這個問題。
因此,可以在配置級別上解決該問題。 由於默認情況下,事務是由內容管理的,因此應更改與Liquibase進行處理的bean的行為。 可以使用EJB部署描述符META-INF/ejb-jar.xml
打開Bean管理的事務:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd"
version="3.2">
<enterprise-beans>
<session>
<ejb-name>MyLiquibaseRunnerBean</ejb-name>
<ejb-class>com.example.MyLiquibaseRunnerBean</ejb-class>
<transaction-type>Bean</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.