【发布时间】: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