2012-05-28 157 views
0

我有這種關係一對多。 這是我的ONE桌子。一對多休眠

private Set<Images> imagesContainer = new HashSet<Images>(0); 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "container") 
public Set<Images> getImagesContainer() { 
    return this.imagesContainer; 
} 

public void setImagesContainer(Set<Images> imagesContainer) { 
    this.imagesContainer = imagesContainer; 
} 

這是我這麼表:

private Container container; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "id_container", nullable = false) 
public Container getContainer() { 
    return this.container; 
} 

public void setContainer(Container container) { 
    this.container = container; 
} 

我怎樣才能插入,與Hibernate,許多集裝箱一個新的容器。 我會試試這個:

... 
Set<Images> images=new HashSet<Images>(); 
images.add(img1); 
images.add(img2); 

Container c = new Container(); 
c.setImagesContainer(images); 
.... 

@Override 
@Transactional(propagation=Propagation.REQUIRED) 
public void save(Container c){ 
    getHibernateTemplate().save(c); 
} 

不要工作!!!我得到了「嵌套的例外是org.hibernate.exception.DataException:無法插入:」 ......

回答

1

當您在Container實體指定mappedBy = "container",關係的所有者是Images實體。那意味着,Hibernate會確定使用image.getContainer()

因爲你沒有設置任何容器實例所有images實例的容器屬性在您的代碼段,image.getContainer()回報NULL,因此hibernate會認爲所有的image實例是ContainerImages實體之間的關係不與任何關聯實例。它會將NULL插入Container表的id_container列,該列不允許NULL(nullable = false),因此會發生錯誤。

爲了解決這個問題,你應該設置Image實例的container屬性:別人的問題發生

Container c = new Container(); 
img1.setContainer(c); 
img2.setContainer(c); 
session.save(c); 
+0

錯誤。我使用您的解決方案或我的解決方案:容器中有1條記錄,圖像中有0條記錄,沒有錯誤。 – enfix

+0

PS:容器沒有ID,因爲這是一個INSERT,而不是UPDATE – enfix