簡體   English   中英

Spring Data REST:NULL值問題

[英]Spring Data REST: NULL values issue

我有一個針對Person類和Contract類的Spring Data REST實現。

這是我的Person.class

@Entity
@Table
public class Person {

    @Column
    private String name;

    @Column
    private String surname;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Contract> contracts;

}

這是我的Contract.class

@Entity
@Table
public class Contract {

    @Column
    private String contractType;

    @Column
    private String contractDesc;

}

這些是我的表定義和數據 (在嵌入式HSQL數據庫中自動生成的腳本):

CREATE MEMORY TABLE PUBLIC.PERSON(ID, NAME, SURNAME, CONTRACT_ID);
CREATE MEMORY TABLE PUBLIC.CONTRACT(ID, CONTRACTTYPE, CONTRACTDESC);
ALTER TABLE PUBLIC.PERSON ADD CONSTRAINT FK_ABCDEFGHIJKLMNOPQRSTUVWXY FOREIGN KEY(CONTRACT_ID) REFERENCES PUBLIC.CONTRACT(ID);
INSERT INTO PERSON VALUES('9876543210abcdefghijklmnopqrstuv', 'Jack', 'Reds','1234567890abcdefghijklmnopqrstuv');
INSERT INTO CONTRACT VALUES('1234567890abcdefghijklmnopqrstuv', 'OTHER', 'Other');

這是從Spring Data REST 獲得響應 ,位於我的URL:localhost / my-app / api / persons /

{
  "_embedded" : {
    "persons" : [ {
      "name" : "Jack",
      "surname" : "Reds",
      "contract" : {
        "contractType" : "OTHER",
        "contractDesc" : "Other",
    ...

但是,如果我執行這部分代碼:

List<Person> persons = personRepository.findAll(new PersonSpec("TEST"));

在調試中,變量“ persons”將與以下數據相稱:

persons= ArrayList<E> (id=233)
    elementData=Object[7] (id=235)
        [0]= Person (id=236)
            name= "Jack" (id=176)
            surname= "Reds" (id=180)
            contract= Contract_$$_jvst951_d (id=240)
                contractType= null
                contractDesc= null
        [1]= Person (id=237)
        [2]= Person (id=238)
    modCount=1
    size = 3

“ contractType”和“ contractDesc”設置為NULL。 此外,我的PersonSpec似乎不對這些字段進行任何過濾:

public class PersonSpec implements Specification<Person> {

    @Override
    public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {

            if (StringUtils.isNotBlank(searchParam.getContract())) {
                predicates.add(cb.and(cb.and(cb.isNotNull(root.get("contract")),
                                             cb.isNotNull(root.get("contract").get("contractType"))),
                                       cb.equal(root.get("contract").get("contractType"), searchParam.getContract())));
            }

怎么了? 我不明白為什么我的人與我的合同之間沒有聯系。

謝謝。

這通常是由於LAZY加載而發生的-當您執行@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)它不會處理Contract數據,因此為什么顯示為null

您可以嘗試通過將fetch = FetchType.LAZYfetch = FetchType.EAGER或自己實例化該對象。

以下是LAZY與EAGER的一些額外信息:

更新
我知道已經有一段時間了,但是您可以通過對服務執行以下操作來獲取惰性集合:

persons.contracts.size();

只要確保您的方法包含@Transactional批注

暫無
暫無

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

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