2016-03-29 88 views
0

我有一个实现Spring Data REST的Person类和Contract类。春天数据REST:NULL值问题

这是我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('abcdefghijklmnopqrstuv', 'Jack', 'Reds','1234567890abcdefghijklmnopqrstuv'); 
INSERT INTO CONTRACT VALUES('1234567890abcdefghijklmnopqrstuv', 'OTHER', 'Other'); 

这是春天的数据REST获得,在我的网址的响应:/

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

本地主机/我 - 应用程序/ API /人,但如果我执行的代码,这部分:

List<Person> persons = personRepository.findAll(new PersonSpec("TEST")); 
在调试变量 “人”

是增值的与此数据:

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()))); 
      } 

有什么不对?我不明白为什么我的人和我的合同之间没有任何联系。

谢谢。

+0

还有就是你的数据模型和你的映射之间的差异。根据数据模型,'Person'有一个'Contract'(因为表'PERSON'有一个'CONTRACT_ID'列],但根据映射,'Person'有一个'List '。 –

+0

我转换为:@OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL) 私人合同合同;但我仍然有问题。 –

+0

也尝试用此替换谓词:'predicates.add(cb.equal(root.join(“contract”)。get(“contractType”),searchParam.getContract()))' –

回答

1

这通常是因为LAZY加载发生的 - 当您执行@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)时,它不会处理Contract数据,因此它显示为null

您可以尝试将fetch = FetchType.LAZY更改为fetch = FetchType.EAGER或自行实例化对象。

这里的懒惰一些额外的信息VS热切的:

UPDATE
我知道它已经有一段时间,但另一种方式你可以获取一个懒惰的集合它' S按做你的服务是这样的:

persons.contracts.size(); 

只要确保你的方法包括@Transactional注释