0

我有这种一对多的关系。这是我的一张桌子。

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;
}

我如何使用休眠插入一个带有许多容器的新容器。我会试试这个:

...
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:无法插入:...”

4

1 回答 1

1

正如您mappedBy = "container"Container实体中指定的那样,关系的所有者是Images实体。这意味着休眠将确定ContainerImages实体之间的关系使用image.getContainer()

因为您没有将任何容器实例设置为images代码片段中所有实例的容器属性,所以image.getContainer()返回NULL并因此休眠将认为所有image实例都不与任何Container实例相关联。它将插入不允许 NULL ( )NULLContainertable列,因此会发生错误。id_containernullable = false

为了解决这个问题,你应该设置实例的container属性:Image

Container c = new Container();
img1.setContainer(c);
img2.setContainer(c); 
session.save(c);
于 2012-05-29T03:08:04.107 回答