2014-04-19 16 views
8

Tôi có một số đối tượng mà tôi không thể xóa và phải cập nhật một trường chung có tên 'đã xóa' thay vì nó. Tôi đọc số there để tôi có thể viết truy vấn chung, sử dụng #{#entityName}. Vì lý do đó tôi đã cố gắng để ghi đè CrudRepository#delete(…) phương pháp như thế này:Làm thế nào để ghi đè lên một phương pháp xóa trên một kho dữ liệu Spring CrudRepository?

public interface DeleteableRepository<T, ID extends Serializable> extends CrudRepository<T,ID>{ 

    @Override 
    @Query("UPDATE #{#entityName} x set x.deleted = 1 where x.id = ?1") 
    public void delete(ID id); 
} 

Nhưng tôi có một bài kiểm tra đơn vị cho thấy tôi sai!

@Test 
public void testDelete() { 

    SomeDeleteableObject sdo = new SomeDeletableObject(); 
    sdo = getDeleteableRepository().create(sdo); 

    Assert.assertNotNull(sdo); 
    Assert.assertNotNull(sdo.getId()); 
    Assert.assertFalse(sdo.isDeleted()); 
    getDeleteableRepository().delete(sdo); 

    sdo = getDeleteableRepository().findOne(sdo.getId()); 
    //Fails here 

} 

Không thể ghi đè CrudRepository các phương pháp như vậy?

+1

Tại sao bạn muốn sửa đổi hành vi xóa kho lưu trữ và không xử lý tình trạng này trong lớp dịch vụ của bạn? – gipinani

+2

vì nếu tôi có thể xử lý điều này trên Lớp lưu trữ, tôi không cần triển khai Dịch vụ bổ sung hoặc Daos. –

Trả lời

5

Để sửa đổi truy vấn, bạn cần thêm @Modifying vào phương pháp.

Hãy chắc chắn bạn đang nhận thức được những tác dụng phụ của phương pháp bạn chọn:

  • Thực thi một truy vấn chế tác được khá nhiều bỏ qua tất cả EntityManager cache. Do đó, findOne(…) tiếp theo có thể/sẽ vẫn trả về phiên bản cũ của đối tượng bạn đã cố gắng xóa trong trường hợp EntityManager đã tải nó. Để ngăn chặn điều đó, hãy đặt cờ clearAutomatically trong @Modifying thành true nhưng lưu ý rằng điều này sẽ khiến tất cả các thay đổi đang chờ xử lý bị xóa.
  • Để thao tác dữ liệu dựa trên truy vấn no callbacks vòng đời sẽ được kích hoạt và no thác sẽ được kích hoạt ở cấp độ của ngữ cảnh bền bỉ. Điều này có nghĩa là người nghe thực thể nghe sự kiện @PreUpdate sẽ không được thông báo. Ngoài ra bất kỳ hoạt động xếp tầng nào
Các vấn đề liên quan