私はエンティティマネージャを使用してネイティブクエリを持つテーブルを作成し、em.persist()を使用して別のテーブルに行を挿入しています。 作成テーブルがネイティブのクエリに失敗したとき、私はロールバックしましたが、em.persist()は常に成功しました。JTAトランザクションで "create table"をネイティブクエリで使用するとロールバックできません。
私は間違ったSQLを意図的に書き込んでキャッチしました。ここ
try {
tx.begin();
table1 t1 = new table1();
t1.setC1(c1);
t1.setC2(c2);
EntityManager em = emf.createEntityManager();
em.persist(t1);
Query query1= em.createNativeQuery("drop table if exists table2").executeUpdate();
Query query2= em.createNativeQuery("xxxxxxxxxxxxxxxx").executeUpdate();
tx.commit();
rt = true;
} catch (Exception e) {
try {
tx.rollback();
} catch (Exception e1) {
PUB.log(e, PUB.getLineInfo());
}
}
はpersistence.xmlのであり、私はMysql5.6使用しています:私はあなたの質問を理解してかどうかわからないんだけど、私はあなたがCREATE TABLE
文をロールバックしたいと思います
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class MainSessionBean implements MainSessionBeanRemote {
@PersistenceUnit(unitName = "CC2016JPA2")
static EntityManagerFactory emf;
@Resource
UserTransaction tx;
本当に私はem.persist(t1)をロールバックしたいと思いますが、それは私が経験したものではありません。 em.persist()はまだ動作します。 – Jianspf