hibernate一对多关联list无法更新

Hibernate一对多数据关联。指的是双向一对多数据关联一个盒子Box有多个卡片card
[code="java"]
public class Box
{
@Id
private Integer id;

@OneToMany(fetch=FetchType.LAZY )
@JoinColumn(name="BOX_ID")
@org.hibernate.annotations.Cascade(
    value={org.hibernate.annotations.CascadeType.SAVE_UPDATE,
            org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) 
@org.hibernate.annotations.IndexColumn(name="POS_NO", base=0)
private List<Card> cards = new ArrayList<Card>();

....

}
[/code]
[code="java"]
@Entity
@Table(name="CARD")
public class Card
{
@Id
private Integer id;

@ManyToOne
@JoinColumn(name="BOX_ID")
private Box box

@Column(name="POS_NO")
private Integer posno ;

....

}
[/code]

我如此注释映射是否存在问题?
从一个Box中在删除一个Card时报错!!!执行sql不对
[code="java"]
public class Bus
{
public Box delandGet(Integer boxId, Integer delCardid){
Box bx = getHibernateTemplate().get( Box.class, boxId);
List cds = bx.getCards();
Card del = null;
int di = -1;
for(int i=0; i<cds.size() ; i++){
Card c = cds.get(i);
if(c.id.equals(delCardid){
del = c;
di = i;
break;
}
}
if(di != -1){
cds.remove(di);
del.setBox(null);
getHibernateTemplate().delete( del ) ;
}

}
}
[/code]
删除始终不成功报错!!
Hibernate: update CARD set BOX_ID=null, POS_NO=null where BOX_ID=? and id=?
Hibernate: update CARD set BOX_ID=null, POS_NO=null where BOX_ID=? and id=?

[code="java"]
public class Item3 {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String name;

@OneToMany(fetch = FetchType.LAZY)
@Cascade(value = {CascadeType.SAVE_UPDATE, CascadeType.DELETE_ORPHAN})
@JoinColumn(name = "item_id", nullable = false)
@org.hibernate.annotations.IndexColumn(name="position", base=0)  
private List<Image3> images = new ArrayList<Image3>();


public List<Image3> getImages() {
    return images;
}

public void setImages(List<Image3> images) {
    this.images = images;
}

public void addImage(Image3 image) {
    this.images.add(image);
    image.setItem(this);
}

public class Image3 {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@ManyToOne()
@JoinColumn(name = "item_id", nullable = false, updatable = false, insertable = false)
private Item3 item;

@Column(name = "filename")
private String fileName;

final Item3 item = new Item3();
item.setName("zzzz");
Image3 image = new Image3();
image.setFileName("aaa");
item.addImage(image);
this.hibernateTemplate.save(item);
System.out.println("=============================================");
this.hibernateTemplate.execute(new HibernateCallback() {
@Override
public Void doInHibernate(Session session) throws HibernateException, SQLException {
Item3 item2 = (Item3) session.get(Item3.class, item.getId());
session.delete(item2);
return null;
}
});

[/code]

你按照这个改改吧,试一下

把你的相关的错误信息贴出来呀,我想你的问题,应该出在你的代码上,
[code="java"] if(di != -1){

cds.remove(di);

del.setBox(null);

getHibernateTemplate().delete( del ) ;

}

[/code]这里的意思是,先将cds集合中的一个元素移除,再将移除元素映射的单个元素设置为空,最后再删除这个被移除的元素,是这样吧!感觉一下,这里有问题吗?

在HIbernate中删除一个附属对象有两种情况,第一种:并不会删除附属对象在数据库中的记录,只是将相应的关联字段进行修改,第二种:将附属对象数据删除。默认情况下应该是第一种伪删除,如果想要删除需要配置cascade="all-delete-orphan"吧,许久没用了,你试一下

实践出真知。要学会自己去尝试。要相信在很多次失败之后总有一次会成功!!!

你这是单向一对多,所以@OneToMany(fetch=FetchType.LAZY,mappedBy="box")。
@JoinColumn(name="BOX_ID",nullable=false)应该就好了 ,因为如果允许为null的话,hibernate就更新为null,也是级联啊,如果不允许为null,hibernate知道我现在应该删除他,试试吧