首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用非常大的子数据集更新ManyToMany关系/链接表的Spring

用非常大的子数据集更新ManyToMany关系/链接表的Spring
EN

Stack Overflow用户
提问于 2017-04-01 18:20:09
回答 1查看 415关注 0票数 0

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

DB表:

优惠券:

代码语言:javascript
复制
 couponId
代码语言:javascript
复制
 ...  

地址:

代码语言:javascript
复制
 addressId
代码语言:javascript
复制
 address
代码语言:javascript
复制
 city
代码语言:javascript
复制
 ...  

coupon_address:

代码语言:javascript
复制
 businessId
代码语言:javascript
复制
 addressId  

实体:

Coupon.java

代码语言:javascript
复制
@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

代码语言:javascript
复制
@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY)  
private Long addressId;  
...  

我们有一个存储过程,它将返回最近的地址,这很好。

问题:

  • 当我们更新优惠券的详细信息时,我们不想在保存到数据库之前用所有地址填充优惠券对象。如果我们不这样做,地址关系将从链接表中删除。是否有方法保存优惠券而不影响链接表?
  • 是否有一种方法可以填充链接表中的条目,而不必将关联的优惠券与整个地址集保存在一起?
  • 当我们查询最近的地址时,我们只希望在客户端的优惠券对象中填充结果地址。由于我们使用的是延迟获取优惠券,所以我们可能避免调用Coupon.getAddresses并手动填充地址子集。

我不知道如何处理第一个问题,也不确定第二个问题是否足够。大多数情况下,我们不必担心每张优惠券都有大量的地址,但潜力确实存在。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-04-02 16:03:14

  1. 那是因为你没有更新优惠券。更新优惠券包括 息票c= em.find(Coupon.class,id);c.setXxx(.); 只需这样做,更新您的优惠券,而不是合并一个新的优惠券没有任何地址。
  2. 不,用你现在的设计,那是不可能的。修改联接表内容的唯一方法是修改addresses集合的内容。但是,您可以选择将联接表映射为实体,而不是使用ManyToMany。或者您可以使用本机查询。
  3. 那是不可能的。addresses是优惠券地址的集合。不是用来加载优惠券的查询找到的地址。如果需要优惠券地址的子集,则执行选择地址的查询。不是选择优惠券的查询。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43160413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档