【问题标题】:Get back UniqueID after persist JPA坚持JPA后取回UniqueID
【发布时间】:2013-03-09 14:30:00
【问题描述】:

我在 Oracle 中有一个日期 + 序列的唯一 ID。示例:20130307-000021

我的实体对象 uniqueID 如下所示:

@Id
// @GeneratedValue
// @Basic(optional = false)
// @NotNull
// @Size(min = 1, max = 15)
@Column(name = "UNIQUE_ID")
private String uniqueId;

每当我使用@GeneratedValue 或其变体时,我都会收到“未找到序列”或其他一些错误。在我持久化一个对象后,我试图取回由 Oracle 数据库生成的唯一 ID。

      this.dbConn.persist(orderDetail);
      this.dbConn.flush();
      //this.dbConn.refresh(orderDetail);
      //OrderDetails od = new OrderDetails();
      //od =(OrderDetails)this.dbConn.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(orderDetail); 

以上是我尝试过的一些不同的事情。当我使用刷新时,我收到一条错误消息,提示找不到“实体”(我假设它正在根据 null 的预持久 uniqueID 查找实体。是否可以取回自动生成的日期+序列号?我通过查看插入的对象并直接复制uniqueID,我能够很好地持久化和检索对象,但显然那是无用的。非常感谢任何帮助,如果您想查看错误消息等,请告诉我。我已经四处搜索我要么看到我正在尝试的“解决方案”,要么有人说他使用了“蛮力变通办法”,但没有描述这意味着什么。

【问题讨论】:

  • 这是鸡和蛋的问题。如果您的 ID 是由触发器生成的(正如我假设的那样),您需要另一个唯一 ID 才能获取刚刚插入的行并从中获取触发器生成的 ID。为什么不先生成 ID,然后将其分配给您的实体并持久化?
  • 感谢您的回复。我们希望数据库生成 uniqueID 而不是代码。也许我们可以让数据库生成一个没有该日期戳的序列。从我读过的例子来看,我可以通过@generatedvalue(strategy = generationtype.sequence) 引用该序列?如果我只尝试一个简单的序列,这是我可能的触发器:
  • if INSERTING then if :new.UNIQUE_ID is null then select ourSchema.USERS_seq.nextval into :new.UNIQUE_ID from DUAL; end if; End If;
  • 那么在我的实体中指定是否正确:@GeneratedValue(strategy=GenerationType.SEQUENCE)@GeneratedValue(generator="my_seq")@SequenceGenerator(name="my_seq",sequenceName="USERS_seq", allocationSize=1)???
  • 以上解决了我的问题,我只是没有使用@GeneratedValue(strategy=GenerationType.SEQUENCE) 而是使用了下面的两个。

标签: java oracle jpa uniqueidentifier


【解决方案1】:

对于任何可能发生这种情况的人。我保留了数据库触发器并使用了:

 @Id
 @Basic(optional = false)
 @NotNull
 @Size(min = 1, max = 15)
 @Column(name = "ORDER_ID")
 private String orderId;

我不需要使用 @GeneratedValue 或其任何变体。

【讨论】:

    猜你喜欢
    • 2017-06-25
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多