我有一个在我的实体表,这是自动生成的主键,但现在我想自动生成唯一的键,所以如何做请帮助我。
@Entity
@Table(name = "director")
public class Director {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
//how to make this field auto generated like above one
@Column(name = "subid", unique=true)
private long sub_id;
我的数据库表图片在这里请参考
2条答案
按热度按时间3j86kqsm1#
您可以使用时间戳或
static AtomicLong
计数器组件sub_id
价值观。尝试用注解定义方法@PrePersist
在实体类中,jpa提供者将在持久化对象之前执行它。注意:在并发环境中使用时间戳可能会导致冲突,并且值不会是唯一的。
bgibtngc2#
经过一个简短的研究,hibernate似乎只支持带有注解的字段生成值的特性
@Id
. 与@Id
违约@generatedValue
hibernate根据所使用的数据库和方言创建适当的方法来生成id字段的值。通常,这类似于创建一个序列并设置列定义(示例来自postgres 12):id bigint not null nextval('director\ id\ seq'::regclass)
有趣的是,这是通过发出如下create语句来实现的:
创建表控制器(id bigserial not null,主键(id))
因此,列类型bigserial实际上生成了用于将默认值插入id列的序列。
有两个选项可供您在生成列id时为列sub\ id生成值。这两个选项都依赖于数据库。
只需手动将序列创建到数据库,并更改列sub\u id以从序列中获取默认值。
或
更改列定义以使用适当的列类型,如:
这将导致hibernate生成如下表:
创建表控制器(id bigserial not null,subid bigserial not null,主键(id))
并生成如下列:
subid bigint not null nextval('director\u subid\u seq'::regclass)
但再次强调:这是特定于数据库的东西。
还要注意:jpa只知道存储到id字段的值。subid被插入到数据库表中,但在实体在其持久性上下文中刷新之前,sub\u id字段不会被填充。