延迟加载返回null值

时间:2013-07-24 16:40:29

标签: spring jpa lazy-loading

我使用spring 3.2,spring data和jpa。

我保存一个广告对象, 我保存消息后

我尝试从广告中访问消息,但它是空的

@Entity
public class Advertisement implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@OneToMany(mappedBy="id", cascade={CascadeType.REMOVE}, fetch=FetchType.LAZY)
private Set<Message> messages;
}

@Entity
public class Message implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@ManyToOne
private Advertisement advertisement;
}

测试单位

Advertisement ads = new Advertisement();
ads = advertisementRepo.save(ads);

assertNotNull(ads);
assertNotNull(ads.getId());

Message message = new Message();
message.setAdvertisement(ads);
message = msgRepo.save(message);

ads = advertisementRepo.findOne(ads.getId());
ads.getMessages(); //return null

为什么ads.getMessages()不返回消息?

3 个答案:

答案 0 :(得分:3)

问题在于JPA没有透明地管理双向关系。在操纵双向关系的一方时,应用程序必须确保另一方相应地更新。

这可以通过编写更新关联实体的setter方法轻松完成。例如,在设置Advertisment的{​​{1}}时,您可以将Message实例添加到Message中的集合中:

Advertisment

答案 1 :(得分:1)

在为其分配新Advertisement集合后尝试保存Message

Advertisement ads = new Advertisement();
ads = advertisementRepo.save(ads);

assertNotNull(ads);
assertNotNull(ads.getId());

Message message = new Message();
message.setAdvertisement(ads);
ads.setMessages(new HashSet<Message>());
ads.getMessages().add(message);
ads = advertisementRepo.save(ads);
message = msgRepo.save(message);

ads = advertisementRepo.findOne(ads.getId());
ads.getMessages(); //return null

答案 2 :(得分:0)

这是返回null,因为您首先保存非拥有实体,然后保存拥有实体。如果您在message之前保存ads,则应返回非空值。