Java Ids和REST上的复杂数据映射&;冬眠

Java Ids和REST上的复杂数据映射&;冬眠,java,hibernate,rest,Java,Hibernate,Rest,我有一些相互关联的非常复杂的数据对象,我需要它们生活在两个独立的数据库(两个应用程序)中。数据的存储不是一个问题,两个应用程序(源和目标)都在寻找相同的数据基类来处理setter、getter、hibernate等 因为我想设计一个以项目为中心的REST服务,所以我有几个调用来批量设置对象。在加载这些内容之后,我想通过调用一个特定于项的REST调用来获取基于项ID的信息。这会带来一些问题,我不确定REST是否能够处理 如果设置了源应用程序上的ID,我担心在Hibernate@JoinTable中

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

因为我想设计一个以项目为中心的REST服务,所以我有几个调用来批量设置对象。在加载这些内容之后,我想通过调用一个特定于项的REST调用来获取基于项ID的信息。这会带来一些问题,我不确定REST是否能够处理

如果设置了
应用程序上的ID,我担心在Hibernate
@JoinTable
中,当它通过对
目标
的REST调用进行移植时,会出现基于ID的项目关联。试图使用
目标
中的ID来获取
项/{ID}/关系
会产生问题,因为
{ID}
来自
目标
并且在加载数据后与
不匹配

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

示例类和DB(代码简化了很多,忽略了一些复杂性):

@表(name=“GUIDELINE”)
公开课指引{
私有字符串名称;
私有集合相关项;
保护长id;
/**Hibernate使用的此对象的数据库id*/
@身份证
@生成值(生成器=“增量”)
@GenericGenerator(name=“increment”,strategy=“increment”)
@XmlElement
@列(name=“ID”,unique=true,nullable=false)
公共长getId(){
返回id;
}
@ManyToMany(fetch=FetchType.EAGER)
@杰索尼奥雷
@JoinTable(name=“RELATIONSHIPS”,
joinColumns={@JoinColumn(name=“GUIDELINE\u ID”,referencedColumnName=“ID”,table=“GUIDELINE”,nullable=false)},
inverseJoinColumns={@JoinColumn(name=“ITEM\u ID”,referencedColumnName=“ID”,table=“RELATEDITEM”,nullable=false)})
公共集getRelatedItems(){
归还相关物品;
}
@列(name=“name”,unique=true,nullable=false,length=240)
公共字符串getName(){
返回此.name;
}
}
@表(name=“RELATEDITEM”)
公共类相关项{
私有字符串名称;
保护长id;
/**Hibernate使用的此对象的数据库id*/
@身份证
@生成值(生成器=“增量”)
@GenericGenerator(name=“increment”,strategy=“increment”)
@XmlElement
@列(name=“ID”,unique=true,nullable=false)
公共长getId(){
返回id;
}
@列(name=“name”,unique=true,nullable=false,length=240)
公共字符串getName(){
返回此.name;
}
}

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

据我所知,在分布式环境中,您不能将
id
用作密钥,因为不同的密钥生成器为您提供不同的密钥。因此,您应该使用一些自然键或添加在多个实例之间唯一的键。通常,UUID用于此目的。能否将UUID添加为复制实体的@NaturalId?@svaor UUID可能会起作用。我将通过
@naturaid
来研究这一点,我认为UUID也可以用作@Id。但是您需要迁移生产实例上的现有数据…您可以使用自然数据作为id吗?因此,在移动项目之后,它们会遇到UUID,但在尝试保存它时,我会遇到类似的错误。建议是取消ID,但是如果我这样做,它不会删除在两个系统之间共享UUID的使用吗?想法?你使用UUID作为id吗?由于数据库方面的一些原因,我在项目中使用UUID作为自然id。但也可以使用id的方法。请看。
@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;
  }
}