Управление транзакциями необходимо для обеспечения целостности и согласованности данных в базе данных. Техника 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() метод приведет к откату всей транзакции, данные не будут вставлены в базу данных.
Скачать Исходный Код
Рекомендации
Оригинал: “https://mkyong.com/spring/spring-aop-transaction-management-in-hibernate/”