如何手动设置自动生成的ID?

9

我有一个名为Task的实体,它有一个taskId字段。问题是,我需要手动创建/更新一些特定的任务,但JPA自动生成器不允许我手动设置taskId。(它会覆盖我的taskId)

是否有办法手动设置taskId?

@Id
@Column(name = "task_id")
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "org.hibernate.id.UUIDGenerator")
private String taskId;

JPA规范不允许用户在某些情况下设置并在其他情况下生成(因为“GeneratedValue”的定义是静态的)。一些JPA提供程序支持它(DataNucleus如果我没记错的话),但如果依赖它,则不具备可移植性。 - Neil Stockton
这个回答解决了你的问题吗?设置Id(PK)生成值为自动和手动 - miken32
6个回答

2

2

@GeneratedValue注释不允许用户手动设置值。您可以手动生成一些字符串格式,如下所示,并使用@Id标记taskId列,而不是使用该注释。

String hql = "from MasterCount where itemType=:type";
Query<MasterCount> query = session.createQuery(hql);
query.setParameter("type", "task");
MasterCount count = query.uniqueResult();
int lastId = count.getItemId() + 1;
count.setItemId(lastId);
task.setTaskId("task0"+lastId);

创建一个主表,其中包含itemId和itemType两列。分别在这两列中保存"task"和0。检查最后输入的数值,将其加1并再次保存。

2
你可以手动进行初始化。
        @Id
        @Column(name= "id")
        @GeneratedValue
        private Long id = Long.parseLong(UUID.randomUUID().toString(), 16);

但是在这里,它将更新实体而不是插入,因为在jpa.save()方法中id不为空。 - Dharmendrasinh Chudasama

1

这个链接 可能会对您有所帮助。

如果我正确理解了您的问题,我会应用一个基本的解决方案。

@Column(name = "task_id", unique = true, nullable = false)
private String taskId;

答案中提到的链接很有帮助! - Hong

0
只需实现 org.springframework.data.domain.Persistable;
在经过了漫长的查找和挫折之后,我使用了这个方法,并且成功地应用于我的 R2DBMS 实体。
@Table(name = "...")
public class .... implements Persistable<String> {

   ...

   public boolean isNew(){
     return id==null; //modify and set your logic
   }

}

0
你们都没理解重点。
有时候在批量导入时,需要使用identity_insert来插入特定的Id。
棘手的部分是如何在不重新发明轮子和手动查询的情况下覆盖默认行为。

1
根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,以帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接