SpringData入門筆記(五) - 修改、刪除和事務

項目獲取

本部份內容,代碼戳這裏java

數據庫數據

insert into `employee` (`id`, `age`, `name`) values('1','13','zhangsan');
insert into `employee` (`id`, `age`, `name`) values('2','20','test1');
insert into `employee` (`id`, `age`, `name`) values('3','21','test2');
insert into `employee` (`id`, `age`, `name`) values('4','22','test3');
insert into `employee` (`id`, `age`, `name`) values('5','20','test4');
insert into `employee` (`id`, `age`, `name`) values('6','21','test5');
insert into `employee` (`id`, `age`, `name`) values('7','22','test6');
insert into `employee` (`id`, `age`, `name`) values('8','22','test16');

更新和刪除

更新和刪除操做用到了一個新的註解@Modifyingspring

通常狀況下,咱們須要使用@Modifying@Query註解執行更新和刪除sql

若是隻使用@Query註解,如:數據庫

@Query("update Employee o set o.age = ?2 where o.id = ?1")
    public void update(Integer id, Integer age);

會拋出下面異常ui

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [update com.dotleo.entity.Employee o set o.age = ?2 where o.id = ?1]; nested exception is java.lang.IllegalStateException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [update com.dotleo.entity.Employee o set o.age = ?2 where o.id = ?1]
    ...
Caused by: java.lang.IllegalStateException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [update com.dotleo.entity.Employee o set o.age = ?2 where o.id = ?1]
	... 37 more
Caused by: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [update com.dotleo.entity.Employee o set o.age = ?2 where o.id = ?1]
	... 57 more

咱們爲它加上@Modifying註解,如:hibernate

@Modifying
    @Query("update Employee o set o.age = ?2 where o.id = ?1")
    public void update(Integer id, Integer age);

運行後會發現,仍是報錯code

org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
    ...
Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query
    ...

這又是爲何呢?事務

其實,若是是查詢操做,咱們沒有必要事務。可是更新操做,咱們要求數據的完整性,因此必須爲操做添加事務。開發

事務的使用

有Java EE開發經驗的人確定知道,若是一次須要操做多張表(執行多個DAO),業務邏輯會寫在Service裏,這樣一個Service方法中調用的全部DAO層方法都被集合到一個事務中,保證了數據的完整性。get

所以,須要先創建EmployeeService,而後再調用EmployeeRepository中的方法。

注意,在Service的方法中,咱們必須爲之添加@Transactional註解,讓它支持事務,才能運行成功。

package com.dotleo.service;

import com.dotleo.repository.EmployeeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author LiuFei
 * @create 2017-11-10 22:57
 */
@Service
public class EmployeeService {

    @Autowired
    private EmployeeRepository employeeRepository;

    @Transactional
    public void update(Integer id, Integer age) {
        employeeRepository.update(id, age);
    }
}

刪除操做不過是sql語句的變化,其餘更爲複雜的更新操做也不過是sql語句的變化,請加練習有助於記憶。

最終源代碼戳這裏

相關文章
相關標籤/搜索