我想了解JPA中的事務是什麼。JPA中的事務實現
說我有部署持久性的GlassFish應用程序:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
<persistence-unit name="survex" transaction-type="JTA">
<jta-data-source>jdbc/MyDatabase</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
</properties>
</persistence-unit>
</persistence>
我試圖調試代碼sniffering請求MySQL服務器:
public String create() {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("survex");
EntityManager em = entityManagerFactory.createEntityManager();
Log log = em.find(Log.class, 1);
EntityTransaction transaction = em.getTransaction();
transaction.begin(); // NOTING HAPPENS ...
log.setMessage("xxx");
em.flush(); // OH, HERE IT IS -> SET autocommit=0; UPDATE LOG SET message = 'xxx' WHERE (id = 1)
log.setMessage("aaa");
em.flush(); // OK -> UPDATE LOG SET message = 'aaa' WHERE (id = 1)
transaction.commit(); // NOTHING HAPPENS! WHERE IS COMMIT?!
log = em.find(Log.class, 1);
transaction = em.getTransaction();
transaction.begin(); // STILL NOTHING ...
log.setMessage("555");
em.flush(); // UPDATE LOG SET message = '555' WHERE (id = 1)
log.setMessage("666");
em.flush(); // UPDATE LOG SET message = '666' WHERE (id = 1)
transaction.commit(); // NOTHING!!!
return log.getMessage();
}
// SOMEWHERE OUTSIDE: COMMIT; SET autocommit=1;
爲什麼?爲什麼JPA表現得如此奇怪?
我希望在每次transaction.commit()調用時提交,或者我誤解了某些內容?
認爲你需要.comfl後的.flush –
否,.commit後的.flush會導致異常。 – corvax