1

我使用弹簧 3.2、弹簧数据和 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() 不返回消息?

4

3 回答 3

4

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

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

@Entity
public class Message implements Serializable {

    ...

    public void setAdvertisement(Advertisement advertisement) {
        this.advertisement = advertisement;
        advertisement.getMessages().add(this);
    }
}
于 2013-07-24T16:52:50.627 回答
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
于 2013-07-24T16:47:58.197 回答
0

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

于 2013-07-24T16:58:16.903 回答