Spring JPA使用非常大的子数据集更新ManyToMany关系/ link_table

时间:2017-04-01 18:20:10

标签: spring spring-data-jpa

我们有可能与数百或数千个地址建立ManyToMany关系的对象,并且正在寻找一种使用Spring JPA在我们的数据库中有效建模的方法。现在,我们有这样的事情:

数据库表:

优惠券:
    couponId
    ......

地址:
    addressId
    解决
    城市
    ......

coupon_address:
    businessId
    addressId

实体:

Coupon.java

@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY)  
private Long couponId;  

...  

@ManyToMany(fetch = FetchType.LAZY)  
@JoinTable(name="coupon_address", joinColumns = {  
    @JoinColumn(name="couponId") }, inverseJoinColumns={  
    @JoinColumn(name="addressId") })  
private Collection<Address> addresses;  

Address.java

@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY)  
private Long addressId;  
...  

我们有一个存储过程,它将返回最近的地址,工作正常。

问题:

  • 当我们更新优惠券的详细信息时,我们不希望在保存到数据库之前必须使用所有地址填充优惠券对象。但是,如果我们不这样做,则会从链接表中删除地址关系。有没有办法保存优惠券而不影响链接表?

  • 有没有办法在链接表中填充条目而没有将相关的优惠券与整套地址一起保存?

  • 当我们查询最近的地址时,我们只希望在客户的优惠券对象中填充结果地址。由于我们使用LAZY获取优惠券,我们可以避免调用Coupon.getAddresses并手动填充地址子集。

我不知道如何处理问题#1并且不确定#2是否足够。大多数时候,我们不必担心每张优惠券都有大量的地址,但潜力确实存在。

谢谢。

1 个答案:

答案 0 :(得分:0)

  1. 那是因为你没有更新优惠券。更新优惠券将包括

    Coupon c = em.find(Coupon.class, id);
    c.setXxx(...);
    

    只需更新您的优惠券,而不是在没有任何地址的情况下合并新优惠券。

  2. 不,根据您目前的设计,这是不可能的。修改连接表内容的唯一方法是修改地址集合的内容。但您可以选择将连接表映射为实体,而不是使用ManyToMany。或者您可以使用本机查询。
  3. 那不可能发生。 addresses是优惠券地址的集合。用于加载优惠券的某些查询找不到地址。如果您想要优惠券地址的子集,则执行选择地址的查询。不是选择优惠券的查询。