延迟加载返回空值 [英] lazy loading return null value

查看:74
本文介绍了延迟加载返回空值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用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方法来完成,该方法也可以更新关联的实体.例如,设置MessageAdvertisment时,可以将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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆