2016-03-03 65 views
0

我有一个eclipselink实体ID列:的EclipseLink生成的ID,而非JPA过程添加记录太

@Id 
@Basic(optional = false) 
@NotNull 
@Column(name = "ID") 
private Long id; 

的问题是,无论我用什么生成策略,我得到的错误,因为我有一个ETL工具插入记录和eclipse链接生成器似乎无法在创建新的ID之前检查现有的ID。

例如,如果JPA发电机刚刚生成的ID 49为一个新的记录,则ETL工具生成20个记录带ID 50-70,当我创建另一个蚀链路记录发电机又发表了50为ID,已经被使用了。

我该如何处理?

回答

1

您的ID生成策略需要:

  1. 根据数据库中的东西。
  2. 获取新的id并以原子方式更新下一个,而无需等待提交。
  3. 由EclipseLink和ETL工具使用。

如果你满足所有三个条件,那么它应该工作,除非数据库本身不是线程安全的。

满足这些条件的最简单方法可能是在数据库的列定义中包含AUTO_INCREMENT。另一种选择是序列发生器,只要你的数据库支持它,但你必须确保ETL工具使用序列,而不是,例如,找到最大电流ID并加1. 1.我猜测ETL工具使用自己的自定义id代(例如max + 1)是您的问题。