延迟加载返回空值 [英] lazy loading return null value
问题描述
我使用spring 3.2,spring数据和jpa.
i use spring 3.2, spring data and jpa.
我保存一个Advertisement对象, 我保存邮件后
i save an Advertisement object, after i save message
我尝试访问广告中的消息,但它为空
i try to access message from Advertisement but it's null
@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()不返回消息?
why ads.getMessages() don't return messages?
推荐答案
问题是JPA无法透明地管理双向关系.在处理双向关系的一侧时,应用程序必须确保对另一侧进行了相应的更新.
The problem is that bidirectional relationships are not transparently managed by JPA. When manipulating one side of a bidirectional relationship, the application has to ensure that the other side is updated accordingly.
这可以很容易地通过编写setter方法来完成,该方法也可以更新关联的实体.例如,设置Message
的Advertisment
时,可以将Message
实例添加到Advertisment
中的集合中:
This can easily be done by writing setter methods that update the associated entity as well. For example, when setting the Advertisment
of a Message
, you can add the Message
instance to the collection in Advertisment
:
@Entity
public class Message implements Serializable {
...
public void setAdvertisement(Advertisement advertisement) {
this.advertisement = advertisement;
advertisement.getMessages().add(this);
}
}
这篇关于延迟加载返回空值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!