考虑这两个类别:opplyeedetaildaoimpl和homplyeeedaoimpl。假设如果我想创建一个新员工,我还应该为homployeedetail创建新记录。
给定以下实施情况,我想知道由于详细信息之后发生了任何例外,外部交易(homploeedaoimpl的TX)是否会退缩。P>
public class SessionHandler {
public static getSession() {
return Configuration.buildSessionFactory().openSession(); //ignore the isConnected or other exception handling for now
}
}
public class EmployeeDetailDAOImpl {
public void create(Serializable employeeId) {
Session session = SessionHandler().getSession();
Transaction tx = session.beginTransaction();
try {
EmployeeDetail detail = new EmployeeDetail(employeeId);
session.save(detail );
} catch (Exception e) {
if (tx!= null) {
tx.rollback;
}
}
session.close();
}
}
public class EmployeeDAOImpl {
public void add(String name) {
Session session = SessionHandler().getSession();
Transaction tx = session.beginTransaction();
try {
Employee employee = new Employee(name);
Serializable employeeId= session.save(employee);
EmployeeDetailDAOImpl detailDAO = new EmployeeDetailDAOImpl();
detailDAO.create(employeeId);
//more things here, that may through exceptions.
} catch (Exception e) {
if (tx!= null) {
tx.rollback;
}
}
session.close();
}
}
实际上,给定的答案都不是100%正确的。
这取决于呼叫方/服务。
如果您是从EJB调用方法,则将有1个涵盖两个方法调用的事务。这样,在例外情况下,交易将退缩两个操作。此背后的原因是,除非在注释或EJB部署描述符中另有说明,否则EJB中的每种方法都是事务。
如果您使用的是Spring或任何其他DI框架,则取决于您的配置。在普通设置中,您的呼叫交易将被暂停,因为JPA EJB将创建自己的交易。但是,您可以使用JtatransactionManager(如下所示)来确保您的EJB和Spring Bean共享相同的交易。
如果您从pojo调用JPA方法,那么您将不得不照顾好自己处理的JTA交易。
是的,它也会回滚实体员工。它甚至不取决于其他实体是否相关。这取决于交易的范围,此处同时包括员工和iMhosheedetails
您正在为每种方法创建两个不同的交易。因此,回滚无法发生。
回滚交易,您需要交易中的促进。
您需要像下面的代码写下::
@Transactional(propagation=Propagation.REQUIRED)
public void testRequired(User user) {
testDAO.insertUser(user);
try{
innerBean.testRequired();
} catch(RuntimeException e){
// handle exception
}
}
以下是链接以获取更多促进信息。http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/transaction/annotation/annotation/propagation.html
http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial