【发布时间】:2015-08-10 18:15:56
【问题描述】:
我有一些相互关联的非常复杂的数据对象,我需要将它们存在于两个独立的数据库(两个应用程序)中。数据的存储不用担心,两个应用程序(source 和 target)都在寻找相同的数据基类来处理 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吗?