我将一个类映射为实体,以将其持久保存在数据库中。我有一个id字段作为主键,因此每次持久保存对象时,都会从序列“myClass_pk_seq”中检索id的值,该代码类似于以下代码。
@Entity
@Table(name="myObjects")
public class MyClass {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
@SequenceGenerator(name="sequence", sequenceName="myClass_pk_seq", allocationSize=1)
@Column(name="myClassId")
private Integer id;
private Integer code;
...
}
我需要在“code”属性中创建类似于id的东西。我需要有一个序列,所以我可以为代码分配序列的下一个值(以保留该值,以防用户想要保留它但不保留数据)。我的意思是用户将看到该字段,如果他不知道输入什么,他可以按下按钮并在屏幕上接收下一个可能的值(他可以接受或不接受)。如何在不保留非主键字段的数据的情况下获取JPA中定义的序列的下一个值(并增加其值)?
我只想要一个方法在与“code”字段关联的序列上调用nextval,并返回该值。使用注释在JPA中执行此操作的最佳方法是什么?
感谢。
答案 0 :(得分:3)
我只想要一个方法在与“code”字段关联的序列上调用nextval,并返回该值。使用注释在JPA中执行此操作的最佳方法是什么?
两种解决方案听起来都有点难看。也许你可以简单地使用像UUID生成器这样的随机生成器。
实际上,您没有提及code
的唯一性(JPA注释并未显示它必须是唯一的)。你为什么不返回一个随机的int?
答案 1 :(得分:0)
See another question/answers on the subject of using sequence defined elsewhere than id fields。您可以使用一个字段(Long id类型)创建虚假实体。将其连接到您在DB中定义的序列。然后为该实体创建一个CrudRepository实现,并使用您定义的假实体对象的空实例调用其save()方法。 Hibernate将为您运行“从双重选择YOUR_SEQ.NEXTVAL”查询。