2016-03-29 16 views
0

Bir Kişi sınıfı ve bir Sözleşme sınıfı için Spring Data REST ile bir uygulamam var. Bu benim Contract.class olduğunuYay Verisi REST: NULL değerleri issue

@Entity 
@Table 
public class Person { 

    @Column 
    private String name; 

    @Column 
    private String surname; 

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

} 

:

Bu

benim Person.class olduğunu

@Entity 
@Table 
public class Contract { 

    @Column 
    private String contractType; 

    @Column 
    private String contractDesc; 

} 

Bunlar benim tablolar tanımları ve veri (komut otomatik olarak oluşturulduğunu Gömülü bir HSQL DataBase'de):

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'); 

Bu benim url'deki, Bahar Veri REST edilen yanıttır:

List<Person> persons = personRepository.findAll(new PersonSpec("TEST")); 
: localhost/my-app/API/kişi/

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

Ama bu kod bölümünü yürütmek eğer değişken "kişiler" hata ayıklama içinde

bu verilerle yüceltilip edilir:

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" ve "contractDesc" NULL olarak ayarlandı.

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

Sorun nedir: Dahası, benim PersonSpec bu alanlarda herhangi bir filtreleme yapmazlar gibi görünüyor? Kişim ile Sözleşmem arasında neden bir bağlantı olmadığını anlamıyorum.

Teşekkürler.

+0

sizin datamodel ve haritalama arasında bir tutarsızlık var içerdiğinden emin olun.Veri modeline göre, bir 'Kişinin' bir 'Sözleşmesi' vardır (çünkü tablo' PERSON'un bir CONTRACT_ID 'sütununa sahiptir) ancak eşleştirmeye göre bir 'Kişinin' bir 'Listesi ' vardır. –

+0

Dönüştürdüğüm: @OneToOne (fetch = FetchType.LAZY, kaskad = CascadeType.ALL) özel Sözleşme sözleşmesi; ama hala problemim var. –

+0

ayrıca yüklemeyi şu şekilde değiştirmeyi deneyin: 'predicates.add (cb.equal (root.join (" contract ")) get (" contractType "), searchParam.getContract())) –

cevap

1

Bu, genellikle LAZY yüklemesi nedeniyle olur - @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)'u yaptığınızda, Contract verilerini getirmeye dikkat etmez, bu nedenle neden null olarak görüntülenir.

fetch = FetchType.LAZY'u fetch = FetchType.EAGER olarak değiştirmeyi deneyebilir veya nesneyi kendiniz eşleştirebilirsiniz.

GÜNCELLEME
Ben bir süre oldu biliyorum ama başka bir yol:

İşte bazı ekstra EAGER vs tembel üzerinde bilgi var tembel bir koleksiyon getirebilirsin ' gibi servis şey yaparak s:

persons.contracts.size(); 

Sadece yöntem @Transactional ek açıklama

İlgili konular