java - Spring + Hibernate + JPA 在 JUnitTest 时, 不发出insert语句
高洛峰
高洛峰 2017-04-17 17:40:40
0
2
861

单元的测试方法为:

@Test
@Transactional(propagation=Propagation.REQUIRED)
@Rollback
public void test() {
    userCreateService.saveUsers(2392L, "@abc.com", true, "A", new Long[]{129L, 1L, 2L, 131L, 4L}, 5);
}

设置了事务, 进入了方法里面, 调用javax.persistence.EntityManager.persist()方法都是不提交insert语句.

发个例子说明一下:

我想要插入一个user到数据库, 然后立刻把他的OPENID字段使用Oracle的sys_guid()函数来生成, 所以persist后, 调用本地查询语句来修改.
发现修改语句一直说修改了0个结果, 我查了一下Hibernate的SQL语句输出, 发现没有发出过insert语句. 这是为何呢?

请各位大神帮忙...............

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(2)
大家讲道理
我找到答案了,JPA的persist是调用Hibernate Session的persist方法进行持久化,persist会在事务提交或者有必要刷新缓存时才提交insert语句。
然而JPA的createNativeQuery就是直接调用本地数据库SQL语句,这个操作在Hibernate中是不算进事务中的。
所以persist的对象未被提交,后面执行的createNativeQuery方法,将不会看到前面要持久化的对象。
黄舟

参考:

Rangka kerja TestContext menangani isu ini. Secara lalai, rangka kerja akan membuat dan melancarkan transaksi untuk setiap ujian. Anda hanya menulis kod yang boleh menganggap kewujudan transaksi. Jika anda memanggil objek yang diproksi secara transaksi dalam ujian anda, objek tersebut akan berkelakuan dengan betul, mengikut semantik transaksinya. Di samping itu, jika kaedah ujian memadamkan kandungan jadual yang dipilih semasa berjalan dalam urus niaga, urus niaga akan melancarkan semula secara lalai, dan pangkalan data akan kembali kepada keadaannya sebelum pelaksanaan ujian. Sokongan transaksi disediakan kepada kelas ujian anda melalui kacang PlatformTransactionManager yang ditakrifkan dalam konteks aplikasi ujian.

Jika anda mahu transaksi dilakukan - luar biasa, tetapi kadangkala berguna apabila anda mahu ujian tertentu mengisi atau mengubah suai pangkalan data - rangka kerja TestContext boleh diarahkan untuk menyebabkan urus niaga dilakukan dan bukannya melancarkan semula melalui @TransactionConfiguration dan @Kembali anotasi.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan