2012-06-19 36 views
19

Có thể tạo các kho chỉ đọc bằng cách sử dụng dữ liệu Spring không?Tạo một kho lưu trữ chỉ đọc với SpringData

Tôi có một số thực thể được liên kết với chế độ xem và một số thực thể con mà tôi muốn cung cấp kho lưu trữ với một số phương pháp như findAll(), findOne() và một số phương pháp có chú thích @Query. Tôi muốn tránh cung cấp các phương pháp như save(…)delete(…) vì chúng không có ý nghĩa và có thể tạo ra lỗi.

public interface ContactRepository extends JpaRepository<ContactModel, Integer>, JpaSpecificationExecutor<ContactModel> { 
    List<ContactModel> findContactByAddress_CityModel_Id(Integer cityId); 

    List<ContactModel> findContactByAddress_CityModel_Region_Id(Integer regionId); 

    // ... methods using @Query 

    // no need to save/flush/delete 
} 

Cảm ơn!

Trả lời

36

Có, cách để đi là thêm kho lưu trữ cơ sở thủ công. Bạn thường sử dụng một cái gì đó như thế này:

public interface ReadOnlyRepository<T, ID extends Serializable> extends Repository<T, ID> { 

    T findOne(ID id); 

    Iterable<T> findAll(); 
} 

Bây giờ bạn có thể có bạn Repos bê tông kéo dài mà chỉ định nghĩa một:

public interface PersonRepository extends ReadOnlyRepository<Person, Long> { 

    T findByEmailAddress(String emailAddress); 
} 

Các phần quan trọng định repo cơ sở được rằng tờ khai phương pháp mang rất cùng một chữ ký như các phương thức được khai báo trong CrudRepository nếu đó là trường hợp chúng tôi vẫn có thể định tuyến các cuộc gọi vào bean triển khai sao lưu proxy của kho lưu trữ. Tôi đã viết chi tiết hơn blog post về chủ đề đó trong blog SpringSource.

+0

Có một điều khó khăn. Nếu tôi đang sử dụng cơ sở dữ liệu trong bộ nhớ như HSQL để kiểm tra tích hợp, tôi có thể sử dụng phương thức lưu của dạng xem để tạo dữ liệu thử nghiệm thay vì tạo mối quan hệ giữa các đối tượng của nó và điền chúng. Vì vậy, trong trường hợp này, tôi sẽ cần phương thức lưu của chế độ xem chỉ để thử nghiệm chứ không phải cho mã sản xuất. Có cách nào để đạt được nó? – DBS

6

Theo như chúng ta có thể thấy trong tài liệu, điều này có thể thực hiện bằng cách triển khai org.springframework.data.repository.Repository.

+0

Wow, làm thế nào tôi bị mất này ... thanks để được giúp đỡ! – jpboudreault

+0

bạn được chào đón! –

14

Để mở rộng về câu trả lời Oliver Gierke, trong các phiên bản gần đây của dữ liệu mùa xuân, bạn sẽ cần chú thích @NoRepositoryBean để ngăn chặn ứng dụng khởi động lỗi:

import org.springframework.data.repository.NoRepositoryBean; 
import org.springframework.data.repository.Repository; 

@NoRepositoryBean 
public interface ReadOnlyRepository<T, ID extends Serializable> extends Repository<T, ID> { 

    T findOne(ID id); 

    List<T> findAll(); 

} 
Các vấn đề liên quan