2014-02-19 37 views
0

我使用Hibernate 4和Spring Data JPA,我與FetchType.EAGER有ManyToOne關係,聯繫人有很多地址,我的問題是當我運行測試時我無法獲得填充收集的聯繫人實體,但如果我檢索地址實體,我可以訪問聯繫人實體。Hibernate 4和Spring Data JPA沒有填充集合

這是跟entitty代碼:

@Entity(name = "CONTACT") 
public class ContactJPA { 
    @OneToMany(mappedBy = "contact", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private Collection<AddressJPA> addresses; 
//getters an setters 
} 

這是地址實體代碼:

@Entity(name = "ADDRESS") 
public class AddressJPA { 
    @ManyToOne(optional=false) 
    @JoinColumn(name="CONTACT_ID", referencedColumnName = "CONTACT_ID", nullable = false) 
    private ContactJPA contact; 
//getters an setters 
} 

要檢索和保存我使用CrudRepository從Spring框架的實體。

這是我的JUnit:

RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = { JPAConfigurationTest.class }) 
@Transactional 
@TransactionConfiguration(defaultRollback = true) 
public class ContactRepositoryIntegrationTest { 

    @Autowired 
    ContactRepository contactRepository; 
    @Autowired 
    AddressRepository addressRepository; 

    AddressJPA addressJPA; 
    Integer key = 1; 

    @Before 
    public void setUp(){ 
     addressJPA = new AddressJPA(); 
     addressJPA = new AddressJPA(); 
     addressJPA.setAddressId(new Integer(1)); 
     addressJPA.setCountry("Argentina"); 
     addressJPA.setCity("Cordoba"); 
     addressJPA.setStreet("San Juan"); 
    } 

    @Test 
    public void thatRetrieveContactShouldPopulateAddress(){ 
     ContactJPA contact = new ContactJPA(); 
     contact.setContactId(key); 
     contact.setEmail("[email protected]"); 
     contact = contactRepository.save(contact); 

     addressJPA.setContactJPA(contact); 
     addressRepository.save(addressJPA); 

     AddressJPA retrievedAddress = addressRepository.findByAddressId(1); 
     System.out.println("Address " + retrievedAddress); 
     ContactJPA retrievedContact = contactRepository.findByContactId(key); 

     System.out.println(retrievedContact.toString()); 
     assertNotNull(retrievedContact); 
     assertEquals(key, retrievedContact.getContactId()); 
     assertEquals(1, contact.getAddresses().size());//this throws null pointer exception 
     Iterator<AddressJPA> it = contact.getAddresses().iterator(); 
     assertEquals(addressJPA, it.next()); 
    } 
} 

什麼建議嗎? 在此先感謝

+0

我會問的第一個問題是你真的想在這種情況下的雙向關係?它們不是JPA所必需的,可能會變得過於複雜。 – jervine10

回答

1

一切看起來很花哨,但您沒有將您的address設置爲您的contact。換句話說,你只從一邊使用你的關係(來自ADDRESS方面)。通常在你堅持你的聯繫之前,你應該給set地址給你的聯繫人。這樣做,你有一個FK列給你的Contact,它指向地址表中的具體地址的PK_ID。可能你的Contact根本沒有看到你的地址,因爲你沒有提及它。你需要做的是將set地址對象通過setter方法連接到你的聯繫人,現在就可以了。

+0

謝謝,這樣做可以解決問題 – nspessot

相關問題