playhiloo
2010-04-20 10:14
浏览 330
已采纳

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=?

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • zhangkaitao 2010-04-21 19:50
    已采纳

    [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]

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

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • iteye_566 2010-04-20 15:21

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

    cds.remove(di);

    del.setBox(null);

    getHibernateTemplate().delete( del ) ;

    }

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

    评论
    解决 无用
    打赏 举报
  • iteye_566 2010-04-20 16:01

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

    评论
    解决 无用
    打赏 举报
  • iteye_566 2010-04-20 17:45

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

    评论
    解决 无用
    打赏 举报
  • zhangkaitao 2010-04-21 09:01

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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题