首页 > 解决方案 > Hibernate OneToMany 创建许多记录

问题描述

我有这两个对象 Input 和 IndisponibleSegment 分别具有一对多的关系:

@Entity  
@Table(name= "input")   
    public class Input {

    private long _id;   
    private String _name;
    private Set<IndisponibleSegment> _indisponibleSegments;

    @Column(name = "name", unique = true, nullable = false, length = 25)
    public String getName() {
      return _name;
    }

    public void setName(String inName) {
      this._name = inName;
    }


  @Id
  @GeneratedValue(strategy = IDENTITY)
  @Column(name = "id", unique = true, nullable = false)
  public long getId() {
    return _id;
  }
  public void setId(long inId) {
    this._id = inId;
  }

  @OneToMany(fetch = FetchType.EAGER, mappedBy = "input", cascade =  CascadeType.ALL, orphanRemoval = true)
  public Set<IndisponibleSegment> getIndisponibleSegments() {
    return _indisponibleSegments;
  }

  public void setIndisponibleSegments(Set<IndisponibleSegment> inIndisponibleSegments) {
    this._indisponibleSegments = inIndisponibleSegments;
  }

}

和:

@Entity
@Table(name = "indisponible_segment")
public class IndisponibleSegment {

private Lane _lane;
private int _id;
private Input _input;

@ManyToOne(fetch=FetchType.EAGER)
@Cascade(value={org.hibernate.annotations.CascadeType.ALL})
@JoinColumn(name="input_id")
public Input getInput() {
  return _input;
}

public void setInput(Input inInput) {
  this._input = inInput;
}

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id")
public int getId() {
  return _id;
}

public void setId(int inId) {
  this._id = inId;
}

@Enumerated(EnumType.STRING)
@Column(name = "lane", nullable = false)
public Lane getLane() {
  return _lane;
}

public void setLane(Lane inLane) {
  this._lane = inLane;
}

}

我的问题是每次运行如下代码:

    DAO dao = new DAO();
    Input input = dao.get(Input.class, new Long(1));
    if(input==null) {
      input = new Input();
      input.setName("Input 1");
    }

    Set<IndisponibleSegment> islist = new HashSet<>();
    IndisponibleSegment is = new IndisponibleSegment();
    is.setInput(input);

    is.setLane(Lane.LANE_FAST);
    islist.add(is);

    input.setIndisponibleSegments(islist);

    dao.saveOrUpdate(input);

我在 indisponible_segments 表中获得了一个新条目,并且旧条目没有被删除,因此仍然存在。

我已经尝试了所有我能想到的组合:级联、删除孤儿、独特的约束......所有。我究竟做错了什么?我想要的是,如果我设置一个新的 indisponibleSegments,旧的将被删除。

标签: javahibernatejpa

解决方案


推荐阅读