簡體   English   中英

在Spring Data REST中獲取和更新延遲加載的許多字段

[英]Fetching & Updating lazy-loaded many-many fields in Spring Data REST

如何正確顯示延遲加載的許多字段,以便用戶可以在Spring Data REST中GET / PATCH / POST / DELETE多個實體關系?

例如,給定一個Student實體和Teacher實體之間存在多對多關系,並且具有以下POJO:

@Entity
public class Teacher { // owner of bidirectional relationship
    @Id
    private int id;
    private String name;
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "teacher_student",
            joinColumns = @JoinColumn(name = "teacher_id"),
            inverseJoinColumns = @JoinColumn(name = "student_id"))
    private Set<Student> students;

    // Constructor, getters/setters...
}

@Entity
public class Student {
    @Id
    private int id;
    private String name;
    @ManyToMany(mappedBy = "students", fetch = FetchType.LAZY)
    private Set<Teacher> teachers;

    // Constructor, getters/setters...
}

實體具有存儲庫:

@RepositoryRestResource(path = "teacher")
public interface TeacherRepository extends CrudRepository<Teacher, int> {}

// similar repository for student

當我將GET發送到localhost:8080 / teacher時,我得到:

"_embedded": {
    "teacher": [
        {
        "name": "Bill Billie",
        "_links": {
            "self": { "href": "http://localhost:8080/teacher/1" },
            "teacher": { ... },
            "students": { "href": "http://localhost:8080/teacher/1/students" }
        }},
        (more teachers here...)
    ]
}
...

但是 ,當我嘗試GEThttp:// localhost:8080 / teacher / 1 / students時 ,我得到404 Not Found ,即使老師“ Bill Billie” 確實在數據庫有一個與他相關聯的學生。

有趣的是,如果將FetchType更改為FetchType.EAGER ,則一切正常,並且可以執行預期的GETPATCH等。這有什么用? 這是一個錯誤,還是我搞砸了?

tl; dr懶惰的訪存無法正確暴露許多關系,但渴望的訪存可以很好地工作。 我該如何懶惰地取用它?

編輯 :如果有關系,我將Spring 4.2.6與Spring Boot 1.3.5和OpenJPA 2.4.1一起用作我的JPA提供程序。

嗯,我不確定為什么不自動獲取經驗更豐富的人會問這個問題,但是您可以為每個查詢指定帶有HQL的join fetch的手動獲取。

select x from X left join fetch x.y y

完成此工作后,您可以按如下所述使用專門創建的控制器覆蓋get語句: Spring Data REST:覆蓋控制器上的存儲庫方法

我認為可能值得嘗試的唯一其他選擇是在Spring數據存儲庫中添加@Lazy批注。

嘗試使RestResources具有事務性。

@Transactional注釋

添加以下依賴

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate4</artifactId>
</dependency>

添加配置類。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter{


    public MappingJackson2HttpMessageConverter jacksonMessageConverter(){
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();

        ObjectMapper mapper = new ObjectMapper();
        //Registering Hibernate4Module to support lazy objects
        mapper.registerModule(new Hibernate4Module());

        messageConverter.setObjectMapper(mapper);
        return messageConverter;

    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //Here we add our custom-configured HttpMessageConverter
        converters.add(jacksonMessageConverter());
        super.configureMessageConverters(converters);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM