2013-03-31 6 views
0

Я использую Spring MVC и зимуютвесна + спящий режим: вручную совершить сделку в конце

@Controller 
public class COACategoriesController { 

protected static Logger log = Logger.getLogger(COACategoriesController.class); 


@Resource(name="COACategoriesService") 
private COACategoriesService obj_coacs; 
@Resource(name="COAMaintenanceService") 
private COAMaintenanceService obj_coams; 

@RequestMapping(value = "/addCoaCategory", method = RequestMethod.POST) 
public String addCoaCategory(@RequestParam("conCatName") String coaCatName, Model model) { 

    Date sysdate = null; 
    String Message=""; 
    try{ 

    sysdate = new Date(); 


    COACategoriesModel model1 = new COACategoriesModel(coaCatName, 1, "", sysdate , 0); 

    COAMaintenanceModel account = new COAMaintenanceModel(); 
     account.setDiscription("Test Description"); 
     account.setCategoryId(model1); 

     Message="Fail-First"; 
     obj_coacs.AddCOACategories(model1); 


     Message="Fail-Second"; 
     obj_coams.AddCOAMaintenance (account); 


     Message="Add Successfully"; 
    }catch(Exception ex){ 
     log.error("Exception.."+ex); 
     model.addAttribute("success", Message); 
    } 



     return "fin/category"; 
    } 



} 

Как совершить сделку вручную, так как все операции сохранения успешно, если транзакция не может вставить, откатить все транзакции в блоке catch. ?

Я использую Spring MVC и зимуют

ответ

3

Я бы предпочел, чтобы создать отдельный метод (совмещая 2 метода) в какой-то службы для выполнения всех необходимых операций там.

+0

да! это решает проблему, с которой я сейчас сталкиваюсь. но можете ли вы сказать мне, пожалуйста, если есть какой-либо способ без комбинирования 2 метода. Фактически в спящем режиме я могу легко совершить транзакцию и отменить транзакцию, но после интеграции с весной mvc у меня проблема. ? –

+1

@ShahidGhafoor вы пытались использовать «@TransactionConfiguration (defaultRollback = false)»? Я думаю, что Алексей прав, вам может понадобиться разбить его на два (или более) метода. Кроме того, вы можете попытаться заставить TransactionManager использовать инъекцию зависимостей Spring или реализовать собственный TransactionManager с ручным фиксацией/откатом. Однако мне лично не нравится эта альтернатива. – Rafa

+1

@ShahidGhafoor, дополняющий мой предыдущий комментарий: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-programmatic – Rafa

1

Сначала свойство connection.autocommit должно быть установлено в false, чтобы включить фиксацию уровня транзакции.

Это может быть сделано путем добавления

<property name="connection.autocommit">false</property> 

в hibernate.cfg.xml

во-вторых, используйте следующий вид кода на вашем уровне DAO

Session s = null; 
Transaction t = null; 
try { 
    s = getSessionFactory().openSession(); 
    t = s.beginTransaction(); 
    // code to persist the object 

} 
catch(HibernateException he) { 
    if(t != null) { 
    t.rollback(); 
    } 
} 
finally { 
    if(s != null) { 
    s.close(); 
    } 
} 
+0

Исключение: нет сеанса спящего режима для потоковой передачи, а конфигурация не позволяет создавать не транзакционные данные, потому что я использую Spring + Hibernate –

 Смежные вопросы

  • Нет связанных вопросов^_^