2013-07-24 34 views
0

我使用spring 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( )不要返回消息?

回答

3

的問題是雙向的關係並不透明地JPA管理。當操縱雙向關係的一側時,應用程序必須確保另一側相應地更新。

這很容易通過編寫更新關聯實體的setter方法來完成。例如,設置MessageAdvertisment時,你可以在Message比如在Advertisment添加到集合:

@Entity 
public class Message implements Serializable { 

    ... 

    public void setAdvertisement(Advertisement advertisement) { 
     this.advertisement = advertisement; 
     advertisement.getMessages().add(this); 
    } 
} 
+0

該工作,但在廣告中,我需要做的: 設置 messages = new HashSet (); 之前我有:設置消息; –

+0

當然,你需要初始化集合,我忘了提及。 – zagyi

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 
0

這是返回null,因爲你第一次保存不擁有實體,然後所屬的實體。如果在ads之前保存message,它應該返回非空值。