この2つのクラスを検討してください:EmployeeDetailDAOImplとEmployeeDAOImpl。新しい従業員を作成する場合は、EmployeeDetailの新しいレコードも作成する必要があります。入れ子セッション/トランザクションでTransaction.rollbackはどうなりますか?
detailDAO.create(employeeId)コールの後に発生した例外のために、外部トランザクション(EmployeeDAOImplのtx)がロールバックされるかどうか、新しいEmployeeDetailのトランザクションもロールバックされますか?
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();
}
}