Saya menggunakan anotasi ini dengan sukses untuk kelas Dao. Dan rollback berfungsi untuk pengujian.
Tapi sekarang saya perlu mengembalikan kode asli, bukan hanya tes. Ada penjelasan khusus untuk digunakan dalam tes. Tapi anotasi mana yang untuk kode non-tes? Ini pertanyaan besar bagi saya. Aku sudah menghabiskan satu hari untuk itu. Dokumentasi resmi tidak memenuhi kebutuhan saya.
class MyClass { // this does not make rollback! And record appears in DB.
EmployeeDaoInterface employeeDao;
public MyClass() {
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "HibernateDaoBeans.xml" });
employeeDao = (IEmployeeDao) context.getBean("employeeDao");
}
@Transactional(rollbackFor={Exception.class})
public void doInsert( Employee newEmp ) throws Exception {
employeeDao.insertEmployee(newEmp);
throw new RuntimeException();
}
}
pegawai Dao adalah
@Transactional
public class EmployeeDao implements IEmployeeDao {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void insertEmployee(Employee emp) {
sessionFactory.getCurrentSession().save(emp);
}
}
Dan berikut ini adalah tes yang anotasinya berfungsi dengan baik:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/HibernateDaoBeans.xml" })
@TransactionConfiguration(transactionManager = "txManager", defaultRollback = true)
@Transactional
public class EmployeeDaoTest {
@Autowired
EmployeeDaoInterface empDao;
@Test
public void insert_record() {
...
assertTrue(empDao.insertEmployee(newEmp));
}
HibernateDaoBeans.xml
...
<bean id="employeeDao" class="Hibernate.EmployeeDao">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
...
** YA, saya membatalkan transaksi. Saya baru saja menambahkan BEAN untuk layanan ... dan kemudian anotasi @Transactional mulai berfungsi :-) **
<bean id="service" class="main.MyClass">
<property name="employeeDao" ref="employeeDao" />
</bean>
Terima kasih semuanya, Rusia tidak akan melupakan Anda!
@Transactional
anotasi. Jika tidak, setiap panggilan DAO dimulai dan melakukan transaksi baru sebelum Anda melempar pengecualian dalam layanan. Intinya adalah: pengecualian harus meninggalkan (melarikan diri) metode yang ditandai sebagai@Transactional
.org.springframework.orm.hibernate3.HibernateTransactionManager
mengonfigurasi dalam konteks Spring Anda? Jika Anda mengaktifkanorg.springframework.transaction
logger, apakah itu menunjukkan sesuatu yang menarik?atau secara terprogram
sumber
Anda dapat membuat pengecualian yang tidak dicentang dari metode yang ingin Anda kembalikan. Ini akan terdeteksi pada musim semi dan transaksi Anda akan ditandai sebagai rollback saja.
Saya berasumsi Anda menggunakan Spring di sini. Dan saya berasumsi bahwa anotasi yang Anda rujuk dalam pengujian Anda adalah anotasi berbasis uji musim semi.
dan perhatikan bahwa:
sumber
Bagi saya rollbackFor tidak cukup, jadi saya harus meletakkan ini dan berfungsi seperti yang diharapkan:
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
Saya harap ini membantu :-)
sumber
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
bawah Anda membantu