如何使用一对多单向

时间:2017-12-26 21:49:28

标签: java hibernate jpa

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

@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异常。说TransportationOrderProductSelectedWarehousePackages表中的transportOrderProductId不能插入两次。

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

TransportationOrderProduct.selectedWarehousePackages.clear()

然后添加一些实体;

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

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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);