2016-03-29 10 views
0

PersonクラスとContractクラスのSpring Data RESTを実装しています。Springデータ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'); 

これは私のURLで、春データRESTからを得た応答である:

List<Person> persons = personRepository.findAll(new PersonSpec("TEST")); 
: localhostの/私のアプリ/ API /人/

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

しかし、私は、コードのこの部分を実行した場合変数 "人" デバッグ中

は、このデータに付加価値化するさ:

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に設定されています。

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

何が問題になっています: はさらに、私のPersonSpecは、これらのフィールドを持つ任意のフィルタリングをしないように見えますか?なぜ私の人と私の契約の間にリンクがないのか分かりません。

ありがとうございました。

+0

が含まれていることを確認してください。データモデルによれば、 'Person'は' PERSON'テーブルに 'CONTRACT_ID'という列があるので' Contract'を1つ持っていますが、マッピングに従って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.LAZYfetch = FetchType.EAGERに変更するか、オブジェクトを自分でインスタンス化することができます。

UPDATE
私はそれがしばらくされている知っているが、別の方法:

ここではいくつかの余分なEAGER対LAZYの情報ですそれはあなたが怠惰なコレクションをフェッチすることができますそれは、あなたのサービスに何かやっによってS:

persons.contracts.size(); 

はちょうどあなたのデータモデルとあなたのマッピングの間に相違がある、あなたの方法は@Transactional注釈