Hibernate4和Spring数据JPA不填充集合

Hibernate4和Spring数据JPA不填充集合,hibernate,jpa,junit4,spring-data,Hibernate,Jpa,Junit4,Spring Data,我使用的是Hibernate 4和Spring Data JPA,我与FetchType有多个关系。由于联系人有多个地址,我的问题是,当我运行测试时,我无法在联系人实体中获取填充的集合,但如果检索到地址实体,我就可以访问联系人实体 这是联系人实体代码: @Entity(name = "CONTACT") public class ContactJPA { @OneToMany(mappedBy = "contact", fetch = FetchType.EAGER, cascade =

我使用的是Hibernate 4和Spring Data JPA,我与FetchType有多个关系。由于联系人有多个地址,我的问题是,当我运行测试时,我无法在联系人实体中获取填充的集合,但如果检索到地址实体,我就可以访问联系人实体

这是联系人实体代码:

@Entity(name = "CONTACT")
public class ContactJPA {
    @OneToMany(mappedBy = "contact", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Collection<AddressJPA> addresses;
//getters an setters
}
为了检索和保存实体,我正在使用spring框架中的Crudepository

这是我的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("test@email.com");
        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());
    }
}
RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(类={JPAConfigurationTest.class})
@交易的
@TransactionConfiguration(defaultRollback=true)
公共类ContactRepositoryIntegrationTest{
@自动连线
联系人存储库联系人存储库;
@自动连线
地址库地址库;
地址JPA地址JPA;
整数键=1;
@以前
公共作废设置(){
addressJPA=新地址JPA();
addressJPA=新地址JPA();
setAddressId(新整数(1));
地址:jpa.setCountry(“阿根廷”);
地址:塞特西城JPA(“科尔多瓦”);
地址:jpa.setStreet(“圣胡安”);
}
@试验
检索ContactShouldPopulateAddress()的公共无效{
ContactJPA contact=新ContactJPA();
contact.setContactId(键);
contact.setEmail(“test@email.com");
contact=contactRepository.save(contact);
地址jpa.setContactJPA(联系人);
addressRepository.save(addressJPA);
AddressJPA retrievedAddress=addressRepository.FindByaAddressId(1);
System.out.println(“地址”+检索地址);
ContactJPA retrievedContact=contactRepository.findByContactId(键);
System.out.println(retrievedContact.toString());
assertNotNull(retrievedContact);
assertEquals(键,retrievedContact.getContactId());
assertEquals(1,contact.getAddresses().size());//这会引发空指针异常
Iterator it=contact.getAddresses().Iterator();
assertEquals(addressJPA,it.next());
}
}
有什么建议吗?
提前感谢

一切看起来都很好,但您没有将您的
地址
设置为您的
联系人
。换句话说,你们只是从一个方面(从地址方面)使用你们的关系。通常,在保留联系人之前,您应该
设置联系人的地址。这样,您的
联系人就有一个FK列,它指向地址表中具体地址的PK_ID。您的
联系人可能根本看不到您的地址,因为您没有提及它。您需要做的是通过setter方法将
地址对象设置为您的联系人,现在就可以了。

我要问的第一个问题是,在这种情况下,您真的想要双向关系吗?JPA不需要它们,它们可能变得过于复杂。谢谢,这样做可以解决问题
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("test@email.com");
        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());
    }
}