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

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]

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名