我使用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()不返回消息?
答案 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
,则应返回非空值。