【问题标题】:Ids and Complex Data Mapping over REST & Hibernate基于 REST 和 Hibernate 的 ID 和复杂数据映射
【发布时间】:2015-08-10 18:15:56
【问题描述】:

我有一些相互关联的非常复杂的数据对象,我需要将它们存在于两个独立的数据库(两个应用程序)中。数据的存储不用担心,两个应用程序(sourcetarget)都在寻找相同的数据基类来处理 setter、getter、hibernate 等。

因为我想设计一个非常以项目为中心的 REST 服务,所以我有几个调用来批量设置对象。加载这些内容后,我正在考虑根据项目的 ID 调用项目特定的 REST 调用以获取信息。这带来了一些我不确定 REST 是否可以处理的问题。

如果 source 应用程序上的 ID 已设置,当它通过 REST 调用移植到 target 时,我担心基于 Hibernate @JoinTable 中的 ID 的项目关联。尝试使用从target 获取item/{id}/relationships 的ID 会产生问题,因为{id} 来自target,并且在加载数据后与source 不匹配。

REST 或 Hibernate 中是否有一种方法可以使用 REST 调用、基于 ID 的 URL 来处理将大量复杂的自定义关系数据从 source 系统移动到 target 系统而不会发生冲突或问题?

示例类和数据库(代码简化很多以忽略一些复杂性):

@Table(name="GUIDELINE")
public class Guideline{
  private String name;
  private Set<RelatedItem> relatedItems;
  protected Long id;
  /** Database id of this object used by Hibernate. */
  @Id
  @GeneratedValue(generator="increment")
  @GenericGenerator(name="increment", strategy = "increment")
  @XmlElement
  @Column(name = "ID", unique = true, nullable = false)
  public Long getId() {
    return id;
  }

  @ManyToMany(fetch = FetchType.EAGER)
  @JsonIgnore
  @JoinTable(name = "RELATIONSHIPS", 
  joinColumns = { @JoinColumn(name = "GUIDELINE_ID", referencedColumnName = "ID", table = "GUIDELINE", nullable = false) }, 
  inverseJoinColumns = { @JoinColumn(name = "ITEM_ID", referencedColumnName = "ID", table = "RELATEDITEM", nullable = false) })
  public Set<RelatedItem> getRelatedItems() {
    return relatedItems;
  }

  @Column(name = "NAME", unique = true, nullable = false, length = 240)
  public String getName(){
    return this.name;
  }
}

@Table(name="RELATEDITEM")
public class RelatedItem{
  private String name;
  protected Long id;
  /** Database id of this object used by Hibernate. */
  @Id
  @GeneratedValue(generator="increment")
  @GenericGenerator(name="increment", strategy = "increment")
  @XmlElement
  @Column(name = "ID", unique = true, nullable = false)
  public Long getId() {
    return id;
  }

  @Column(name = "NAME", unique = true, nullable = false, length = 240)
  public String getName(){
    return this.name;
  }
}

【问题讨论】:

  • 据我了解,您不能在分布式环境中使用id 作为密钥,因为不同的密钥生成器会为您提供不同的密钥。因此,您应该使用一些自然键或添加几个实例之间唯一的键。通常,UUID 用于此目的。您可以将 UUID 添加为复制实体的 @NaturalId 吗?
  • @svaor UUID 可能会起作用。我会通过@NaturalId 来看看
  • 我认为 UUID 也可以用作@Id。但是您需要迁移生产实例上的现有数据...
  • 你能用自然数据作为你的id吗?

标签: java hibernate rest


【解决方案1】:

一般的做法是使用自然键来识别分布式环境中的对象。除了生成的键之外,您还可以添加自然键或使用生成器为主键创建 UUID 值。

【讨论】:

  • 因此,在移动项目后,它们遇到了 UUID,但在尝试保存它时,我收到类似于 this post 的错误。建议是取消 ID,但如果我这样做,它不会删除两个系统之间共享的 UUID 的使用吗?想法?
  • 你使用UUID作为id吗?由于数据库方面的一些原因,我在我的项目中使用 UUID 作为自然 ID。但是也可以使用带有 id 的方法。请参阅this question.
猜你喜欢
  • 2012-10-29
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多