Рубрики
Без рубрики

Управление транзакциями Spring AOP в режиме гибернации

– Весеннее управление транзакциями AOP в режиме гибернации

Управление транзакциями необходимо для обеспечения целостности и согласованности данных в базе данных. Техника AOP Spring позволяет разработчикам управлять транзакцией декларативно.

Вот пример, показывающий, как управлять транзакцией гибернации с помощью Spring AOP.

P.S Многие файлы конфигурации Hibernate и Spring скрыты , показаны только некоторые важные файлы, если вы хотите получить практическую информацию, загрузите полный проект в конце статьи.

1. Создание таблицы

Сценарии таблиц MySQL, таблица “продукт ” и таблица ” количество продукта в наличии “.

CREATE TABLE  `mkyong`.`product` (
  `PRODUCT_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `PRODUCT_CODE` varchar(20) NOT NULL,
  `PRODUCT_DESC` varchar(255) NOT NULL,
  PRIMARY KEY (`PRODUCT_ID`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE  `mkyong`.`product_qoh` (
  `QOH_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `PRODUCT_ID` bigint(20) unsigned NOT NULL,
  `QTY` int(10) unsigned NOT NULL,
  PRIMARY KEY (`QOH_ID`),
  KEY `FK_product_qoh_product_id` (`PRODUCT_ID`),
  CONSTRAINT `FK_product_qoh_product_id` FOREIGN KEY (`PRODUCT_ID`) 
  REFERENCES `product` (`PRODUCT_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2. Бизнес-объект Продукта

В этой реализации ” производство ” метод save() вставит запись в таблицу ” продукт ” через класс “PRODUCTDAO ” и запись количества в наличии в ” PRODUCTQOH ” таблицу через ” productQohBo ” класс.

package com.mkyong.product.bo.impl;

import com.mkyong.product.bo.ProductBo;
import com.mkyong.product.bo.ProductQohBo;
import com.mkyong.product.dao.ProductDao;
import com.mkyong.product.model.Product;
import com.mkyong.product.model.ProductQoh;

public class ProductBoImpl implements ProductBo{
	
	ProductDao productDao;
	ProductQohBo productQohBo;
	
	public void setProductDao(ProductDao productDao) {
		this.productDao = productDao;
	}
	
	public void setProductQohBo(ProductQohBo productQohBo) {
		this.productQohBo = productQohBo;
	}

	//this method need to be transactional
	public void save(Product product, int qoh){
		
		productDao.save(product);
		System.out.println("Product Inserted");
		
		ProductQoh productQoh = new ProductQoh();
		productQoh.setProductId(product.getProductId());
		productQoh.setQty(qoh);
		
		productQohBo.save(productQoh);
		System.out.println("ProductQoh Inserted");
	}
}

Файл конфигурации компонентов Spring.

   
   
   	
   	
   
 
   
   
   	
   

Запустите его

	Product product = new Product();
    product.setProductCode("ABC");
    product.setProductDesc("This is product ABC");
    	
    ProductBo productBo = (ProductBo)appContext.getBean("productBo");
    productBo.save(product, 100);

Предположим, что save() не имеет функции транзакции, если исключение генерируется productQohBo.save() , вы вставите запись только в таблицу “ продукт “, запись не будет вставлена в таблицу “ качество продукта

3. Управление Транзакциями

Объявлен компонент ‘ TransactionInterceptor ‘ и компонент ‘ HibernateTransactionManager ‘ для транзакции Hibernate и передачи необходимого свойства.



    
	
	
	   
		PROPAGATION_REQUIRED
	   
	
    
   
    
	  
	  
    


Атрибуты транзакции

В перехватчике транзакций вы должны определить, какие атрибуты транзакции ” поведение распространения ” следует использовать. Это означает, что если транзакционный ‘Productdaoimpl.save() ‘ метод называется другим методом ‘ productqohbo.save() ‘, как следует распространять транзакцию? Должен ли он продолжать выполняться в рамках существующей транзакции? или начать новую транзакцию самостоятельно.

Существует 7 типов размножения, поддерживаемых весной:

  • РАСПРОСТРАНЕНИЕ_ ТРЕБУЕТСЯ – Поддержите текущую транзакцию; создайте новую, если таковой не существует.
  • PROPAGATION_SUPPORTS – Поддерживает текущую транзакцию; выполняется без транзакции, если таковой не существует.
  • PROPAGATION_MANDATORY – Поддерживает текущую транзакцию; создает исключение, если текущая транзакция не существует.
  • РАСПРОСТРАНЕНИЕ_РЕКЛАМА_НОВ – Создайте новую транзакцию, приостановив текущую транзакцию, если она существует.
  • PROPAGATION_NOT_SUPPORTED – Не поддерживает текущую транзакцию; вместо этого всегда выполняйте не транзакционно.
  • PROPAGATION_NEVER – Не поддерживает текущую транзакцию; создает исключение, если текущая транзакция существует.
  • PROPAGATION_NESTED – Выполняется во вложенной транзакции, если текущая транзакция существует, ведет себя как PROPAGATION_REQUIRED else.

В большинстве случаев вам может просто понадобиться использовать PROPAGATION_REQUIRED.

Кроме того, вам также необходимо определить метод поддержки этих атрибутов транзакции. Имя метода поддерживается в формате подстановочных знаков, сохранить* будет соответствовать всем именам методов, начинающимся с сохранить(…).

Менеджер транзакций

В транзакции гибернации вам необходимо использовать HibernateTransactionManager . Если вы имеете дело только с чистым JDBC, используйте DataSourceTransactionManager ; в то время как JTA, используйте JtaTransactionManager .

4. Компонент Прокси-фабрики

Создайте новый компонент фабрики прокси-сервера для Production и установите свойство ‘ Имена перехватчиков ‘.

   
   
   	
   	
   
 
   
   
   	
   
   
   
	
	
		
			transactionInterceptor
		
	
  

Запустите его

    Product product = new Product();
    product.setProductCode("ABC");
    product.setProductDesc("This is product ABC");
    	
    ProductBo productBo = (ProductBo)appContext.getBean("productBoProxy");
    productBo.save(product, 100);

Получите свой прокси-компонент ‘ product B o Прокси ‘, и ваш метод save() теперь поддерживает транзакции, любые исключения внутри productBo.save() метод приведет к откату всей транзакции, данные не будут вставлены в базу данных.

Скачать Исходный Код

Рекомендации

  1. Рекомендации
  2. Рекомендации

Оригинал: “https://mkyong.com/spring/spring-aop-transaction-management-in-hibernate/”