2012-01-10 55 views
1

你知道爲什麼這樣的:預期JPA級聯集內容

class Owner { 
    @OneToMany(mappedBy = "owner", 
    cascade = CascadeType.ALL) 
    public Set<Storage> storages 
    ... 

class Storage { 
    @ManyToOne 
    public Owner owner 
    ... 

不起作用:

Storage s = new Storage("S1") 
Owner o = new Owner("O1") 
o.storages.add(s) 
... 
em.persistAndFlush(o) 
... 
s = Storage.get... 
assert(s.owner != null, "Storage does not have an Owner") 
o = Order.get... 
assert(!o.storages.isEmpty, "Owner does not have any Storage") 

測試失敗:

[info] - Storage *** FAILED *** 
[info] Storage does not have an Owner 

我該如何解決?

回答

2

這個問題每兩天詢問一次。 JPA使用雙向關聯的擁有方來知道是否存在關聯。擁有方是mappedBy屬性。無論

s.setOwner(o); 
+0

它在CascadeType.ALL是:那麼,告訴JPA是所有者和存儲之間是否存在關聯,則必須將存儲的擁有者?因爲現在,我得到「所有者沒有任何存儲」... – Etam 2012-01-10 18:49:55

+1

保持對象圖的連貫性是**你的責任。您必須初始化關聯的兩側。如果你只是設置了自己的一面,這個關聯將會持續下去,但是Hibernate不會爲你初始化另一面。如果您在** new **事務中重新加載對象,則JPA將爲您填充雙方。在當前事務中,它將從緩存中返回對象,就像初始化它們一樣。 – 2012-01-10 19:30:52