0

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

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

请帮忙。

我的代码看起来像这样

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

}

谢谢

4

2 回答 2

0

就像 jtahlborn 所说,您可能忘记将 ID 放在实体上,因此休眠别无选择,只能删除所有内容,然后再次插入以进行任何更改。查看此链接以获取更多信息:

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

于 2013-09-23T12:25:49.300 回答
0

在父实体下添加子实体有多种方式如下

  • 以下代码将用于添加一个新的孩子:
    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)。我建议首先在链接中研究它们之间的区别,然后 根据您的要求 使用适当的CascadeType 。

于 2013-09-23T12:25:55.730 回答