如何使用一对多单向删除两个表之间的关系

问题描述 投票:0回答:1

我有两个与一对多关系绑定的实体。但是一个实体可以不存在另一个实体。所以这种关系是单向的。就这样;

@Entity
public class TransportationOrderProduct  {

    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    private List<WarehousePackage> selectedWarehousePackages;
}

@Entity
public class WarehousePackage{
}

并且hibernate创建了这些表;

TransportationOrderProduct

  • ID

TransportationOrderProductSelectedWarehousePackages

  • transportationOrderProductId
  • selectedWarehousePackageId

WarehousePackage

  • ID

在获取集合(selectedWarehousePackages)时,一切正常。但是当我清除TransportationOrderProduct.selectedWarehousePackages列表并添加新列表时,Hibernate会抛出DuplicateEntry异常。说TransportOrderProductSelectedWarehousePackages表中的transportOrderProductId不能插入两次。

我认为这是因为Hibernate在调用时不会删除TransportationOrderProductSelectedWarehousePackages表中的关系;

TransportationOrderProduct.selectedWarehousePackages.clear()

然后添加一些实体;

TransportationOrderProduct.selectedWarehousePackages.add(newPackage)
TransportationOrderProduct.selectedWarehousePackages.add(newPackage)
.
.

有人可以帮忙吗?

java hibernate jpa
1个回答
0
投票

根据我的理解,这听起来很关系很多

enter image description here

不要使用单向一对多关联

避免域模型中的单向一对多关联。否则,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);
© www.soinside.com 2019 - 2024. All rights reserved.