我有两个与一对多关系绑定的实体。但是一个实体可以不存在另一个实体。所以这种关系是单向的。就这样;
@Entity
public class TransportationOrderProduct {
@OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
private List<WarehousePackage> selectedWarehousePackages;
}
@Entity
public class WarehousePackage{
}
hibernate创建了这些表;
TransportationOrderProduct
TransportationOrderProductSelectedWarehousePackages
WarehousePackage
获取集合时(selectedWarehousePackages)一切正常。 但是当我清除 TransportationOrderProduct.selectedWarehousePackages 列表并添加新列表时,Hibernate会抛出DuplicateEntry异常。说TransportationOrderProductSelectedWarehousePackages表中的transportOrderProductId不能插入两次。
我认为这是因为Hibernate在调用时不会删除 TransportationOrderProductSelectedWarehousePackages 表中的关系;
TransportationOrderProduct.selectedWarehousePackages.clear()
然后添加一些实体;
TransportationOrderProduct.selectedWarehousePackages.add(newPackage)
TransportationOrderProduct.selectedWarehousePackages.add(newPackage)
.
.
有人可以帮忙吗?
答案 0 :(得分:0)
它的声音关系是一个 - 我理解的很多
不要使用单向一对多关联
避免域模型中的单向一对多关联。否则,Hibernate可能会创建意外的表并执行比预期更多的SQL语句,这肯定描述了为什么hibernate创建3个实体,而你的实现应该是2个实体,关系为1-2-many。
单向声音的定义在我们的案例中不是问题,如果我们使用定向它OKAY它将满足您的需要attribute to map our association
使用注释
@Entity
public class TransportationOrderProduct {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
@OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
private Set<WarehousePackage> packages= new HashSet<>();
public Set<WarehousePackage> getPackages() {
return packages;
}
public void setPackages(Set<WarehousePackage> packages) {
this.packages = packages;
}
public void addPackages (WarehousePackage value) {
this.packages.add(value);
}
public void clearPackages (WarehousePackage value) {
this.packages.clear();
}
...
}
@Entity
public class WarehousePackage{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
}
您可以根据需要保存运输订单
TransportationOrderProduct transportation = new TransportationOrderProduct ();
Set<WarehousePackage> packages = new HashSet <> () ;
WarehousePackage package1 = new WarehousePackage () ;
WarehousePackage package2 = new WarehousePackage () ;
packages.add(package1);
packages.add(package2);
transportation.setPackages(packages) ;
session.save(transportation);