带有连接 table 的双向 @ManyToOne 创建重复键
Bidirectional @ManyToOne with join table creates duplicate key
我正在实施 @ManyToOne 双向 关系与 join table 使用 hibernate,但是当我保留一些数据时,hibernate 声称关系 table 中的记录被插入两次,违反了唯一约束,因为错误下面的消息显示:
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ERROR: duplicate key value violates unique constraint "tillage_sample_pkey"
Detail: Key (id_tillage, id_sample)=(82, 110) already exists.
我有以下 tables:
- Tillage(id,其他一些数据)(一个Tillage可以有多个样本)
- Sample (id, some other data) (一个Sample只能有一个Tillage)
- tillage_sample (id_tillage, id_sample) PK (id_tillage, id_sample)
当我创建一个 Tillage 对象时,我填充了一个 Sample。在 Sample 对象中,我指向 Tillage 对象,创建一个 "double binding"。
我猜是这个“double bind”造成了麻烦,因为 Tillage/Sample 关系在保存耕作时由 hibernate 保留并重复该步骤尝试将耕作保留在样本中(这是同一个耕作对象)。
这是我的代码,以帮助您理解我的问题:
Tillage.java
@Entity
@Table(name = "tillage")
public class Tillage implements Serializable {
private static final long serialVersionUID = 3605331584324240290L;
@Id
@GeneratedValue(generator = "tillage_id_seq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "tillage_id_seq", sequenceName = "tillage_id_seq", allocationSize = 1)
private Integer id;
@Column(name = "name")
private String name;
// Other simple attributes
@ManyToOne
@JoinColumn(name = "id_farm")
@JsonBackReference
private Farm farm;
// This relation is the problematic one
@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "tillage_sample",
joinColumns = { @JoinColumn(name = "id_tillage") },
inverseJoinColumns = {@JoinColumn(name = "id_sample") })
private List<Sample> sampleList;
// Although similar, this one is doing OK
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "tillage_owner",
joinColumns = { @JoinColumn(name = "id_tillage") },
inverseJoinColumns = {@JoinColumn(name = "id_owner") })
private List<Owner> ownerList;
// getters & setters
}
Sample.java
@Entity
@Table(name = "sample")
public class Sample implements Serializable {
private static final long serialVersionUID = 7064809078222302493L;
@Id
@GeneratedValue(generator = "sample_id_seq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "sample_id_seq", sequenceName = "sample_id_seq", allocationSize = 1)
private Integer id;
@Column(name = "name")
private String name;
// Other simple attributes
// This completes the relation Tillage-Sample
@ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "tillage_sample",
joinColumns = { @JoinColumn(name = "id_sample") },
inverseJoinColumns = {@JoinColumn(name = "id_tillage") })
private Tillage tillage = new Tillage();
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable(name = "sample_sample_item",
joinColumns = { @JoinColumn(name = "id_sample") },
inverseJoinColumns = {@JoinColumn(name = "id_sample_item") })
private List<SampleItem> sampleItemList;
// Getters and Setters
}
SomeService.java
...
@Override
public Tillage toTillage(TillageDTO dto) {
Tillage tillage = new Tillage();
tillage.setName(dto.getNameTillage());
// Fill the samples of the tillage
for(ArrSample sample : dto.getSamples().getArrSample()){
Sample s = new Sample();
s.setName(sample.getName());
// Setting the tillage in the Sample object
s.setTillage(tillage);
// Fill the items of the sample
for(Array arr : sample.getAreas().getArray()){
SampleItem si = new SampleItem();
si.setProduction(Double.parseDouble(arr.getProduction()));
// Double binding between sample and sampleItem
si.setSample(s);
s.getSampleItemList().add(si);
}
// Adding a sample to Tillage
tillage.getSampleList().add(s);
}
return tillage;
}
public void save(TillageDTO dto){
Tillage t = this.toTillage(dto);
// The error occurs when we persist the data
// The entityManager is Autowired by Spring and works in other places
entityManager.persist(tillage);
}
这不是双向 OneToMany。使用相同的联接 table.
的单向关联太独立了
在双向关联中,一侧必须与另一侧相反。对于 OneToMany,单边必须是反面:
@OneToMany(mappedBy = "tillage", cascade=CascadeType.ALL, fetch = FetchType.EAGER)
private List<Sample> sampleList;
我正在实施 @ManyToOne 双向 关系与 join table 使用 hibernate,但是当我保留一些数据时,hibernate 声称关系 table 中的记录被插入两次,违反了唯一约束,因为错误下面的消息显示:
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ERROR: duplicate key value violates unique constraint "tillage_sample_pkey"
Detail: Key (id_tillage, id_sample)=(82, 110) already exists.
我有以下 tables:
- Tillage(id,其他一些数据)(一个Tillage可以有多个样本)
- Sample (id, some other data) (一个Sample只能有一个Tillage)
- tillage_sample (id_tillage, id_sample) PK (id_tillage, id_sample)
当我创建一个 Tillage 对象时,我填充了一个 Sample。在 Sample 对象中,我指向 Tillage 对象,创建一个 "double binding"。
我猜是这个“double bind”造成了麻烦,因为 Tillage/Sample 关系在保存耕作时由 hibernate 保留并重复该步骤尝试将耕作保留在样本中(这是同一个耕作对象)。
这是我的代码,以帮助您理解我的问题:
Tillage.java
@Entity
@Table(name = "tillage")
public class Tillage implements Serializable {
private static final long serialVersionUID = 3605331584324240290L;
@Id
@GeneratedValue(generator = "tillage_id_seq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "tillage_id_seq", sequenceName = "tillage_id_seq", allocationSize = 1)
private Integer id;
@Column(name = "name")
private String name;
// Other simple attributes
@ManyToOne
@JoinColumn(name = "id_farm")
@JsonBackReference
private Farm farm;
// This relation is the problematic one
@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "tillage_sample",
joinColumns = { @JoinColumn(name = "id_tillage") },
inverseJoinColumns = {@JoinColumn(name = "id_sample") })
private List<Sample> sampleList;
// Although similar, this one is doing OK
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "tillage_owner",
joinColumns = { @JoinColumn(name = "id_tillage") },
inverseJoinColumns = {@JoinColumn(name = "id_owner") })
private List<Owner> ownerList;
// getters & setters
}
Sample.java
@Entity
@Table(name = "sample")
public class Sample implements Serializable {
private static final long serialVersionUID = 7064809078222302493L;
@Id
@GeneratedValue(generator = "sample_id_seq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "sample_id_seq", sequenceName = "sample_id_seq", allocationSize = 1)
private Integer id;
@Column(name = "name")
private String name;
// Other simple attributes
// This completes the relation Tillage-Sample
@ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "tillage_sample",
joinColumns = { @JoinColumn(name = "id_sample") },
inverseJoinColumns = {@JoinColumn(name = "id_tillage") })
private Tillage tillage = new Tillage();
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable(name = "sample_sample_item",
joinColumns = { @JoinColumn(name = "id_sample") },
inverseJoinColumns = {@JoinColumn(name = "id_sample_item") })
private List<SampleItem> sampleItemList;
// Getters and Setters
}
SomeService.java
...
@Override
public Tillage toTillage(TillageDTO dto) {
Tillage tillage = new Tillage();
tillage.setName(dto.getNameTillage());
// Fill the samples of the tillage
for(ArrSample sample : dto.getSamples().getArrSample()){
Sample s = new Sample();
s.setName(sample.getName());
// Setting the tillage in the Sample object
s.setTillage(tillage);
// Fill the items of the sample
for(Array arr : sample.getAreas().getArray()){
SampleItem si = new SampleItem();
si.setProduction(Double.parseDouble(arr.getProduction()));
// Double binding between sample and sampleItem
si.setSample(s);
s.getSampleItemList().add(si);
}
// Adding a sample to Tillage
tillage.getSampleList().add(s);
}
return tillage;
}
public void save(TillageDTO dto){
Tillage t = this.toTillage(dto);
// The error occurs when we persist the data
// The entityManager is Autowired by Spring and works in other places
entityManager.persist(tillage);
}
这不是双向 OneToMany。使用相同的联接 table.
的单向关联太独立了在双向关联中,一侧必须与另一侧相反。对于 OneToMany,单边必须是反面:
@OneToMany(mappedBy = "tillage", cascade=CascadeType.ALL, fetch = FetchType.EAGER)
private List<Sample> sampleList;