在hibernate中更新child

时间:2013-09-23 12:09:33

标签: java hibernate

如何避免删除和重新插入子记录?

对于Ex:我在子表中有10行,我想添加第11行。但看起来hibernate正在删除所有旧的子记录并重新插入新记录。

请帮忙。

我的代码看起来像这样

     @Entity
     @Table(name = "ACCESS_GROUP")
   public class AccessGroup implements java.io.Serializable {

private static final long serialVersionUID = 1L;

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

@Column(nullable = false ,unique =true)
private String group_name;


@SuppressWarnings("deprecation")
@OneToMany(cascade=CascadeType.ALL) 
@Cascade (value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
@JoinColumn(name="ID", nullable=false)
@OrderBy("im")
private Set<GroupIm> imSet = null;

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "accessGroup")
private Set<accessGroupList> accessGroupLists;

.....}

,孩子就是这样

@Entity
@Table(name = "ACCESS_GROUP_IM")
public class AccessGroupIm implements Serializable {

private static final long serialVersionUID = 1L;

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

@Column(nullable = false)
private String im;  


public accessGroupIm() {
    // empty constructor for hibernate
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getIm() {
    return im;
}

public void setIm(String im) {
    this.im = im;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((id == null) ? 0 : id.hashCode());
    result = prime * result + ((im == null) ? 0 : im.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    accessGroupIm other = (accessGroupIm) obj;
    if (id == null) {
        if (other.id != null)
            return false;
    } else if (!id.equals(other.id))
        return false;
    if (im == null) {
        if (other.im != null)
            return false;
    } else if (!im.equals(other.im))
        return false;
    return true;
}

}

由于

2 个答案:

答案 0 :(得分:0)

就像jtahlborn说的那样,你可能会伪造将ID放在实体上,所以hibernate别无选择,只能删除所有内容然后再次插入它以进行任何更改。请查看此链接以获取更多信息:

http://assarconsulting.blogspot.com.br/2009/08/why-hibernate-does-delete-all-then-re.html

答案 1 :(得分:0)

有多种方法可以在父实体下添加子实体,如下所示

  
      
  • 以下代码将用于添加新的Child:
  •   
    Parent p = (Parent) session.load(Parent.class, pid);
    Child c = new Child();
    c.setParent(p);
    p.getChildren().add(c);
    session.save(c);
    session.flush();
  
      
  • 您还可以创建Parent的addChild()方法。
  •   
 public void addChild(Child c) {
        c.setParent(this);
        children.add(c);
 }

然后添加Child的代码如下所示:

Parent p = (Parent) session.load(Parent.class, pid);
    Child c = new Child();
    p.addChild(c);
    session.save(c);
    session.flush();

修改    您已在代码中使用了 CascadeTypes javax.persistence.CascadeType and org.hibernate.annotations.CascadeType)。我建议先在link中研究它们之间的区别,然后根据您的要求使用正确的 CascadeType