java - Hibernate 自动生成第二个 id

标签 java mysql hibernate jpa

假设我有一个表,只有ID和Car两列,Car列可以有重复的值,例如:

id | car

1 | 200

2 | 200

3 | 201

4 | 201

5 | 201

6 | 202

我需要一个新列,它会在插入新记录时自动生成按 Cars 分组的第二个 id,如下所示:

id | car | second_id

1 | 200 | 1

2 | 200 | 2

3 | 201 | 1

4 | 201 | 2

5 | 201 | 3

6 | 202 | 1

我已经尝试过类似的方法但不起作用:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@Column(name = "car")
private int car;

@GeneratedValue(generator="second_id")
@GenericGenerator(name="second_id", strategy="com.example.SecondIdGenerator")
@Column(name = "second_id", unique = false, nullable = false, length = 20)
private int secondId;

SecondIdGenerator 类目前只返回一个固定值用于测试,但是这个值没有显示在数据库中,换句话说,它不起作用。

我该怎么做? Hibernate 有这方面的东西吗?

(我正在使用 MySQL 数据库)

最佳答案

我不知道有任何工具支持此类专栏。

您可以使用触发器来计算 second_id 列的值。您可能需要一个“插入前”触发器。触发器会找到正在插入的汽车的现有最大 second_id,并为新行的 second_id 值添加一个。如果允许更新 car 列,则可以支持以相同方式重新计算 second_id 列(尽管这会在 second_id 序列中为先前 car 值的 second_id 列留下空洞)。

如果您要有多个维护列值的触发器,您可能会发现创建一个封装业务逻辑的存储过程会更容易。

您还希望对 (car, second_id) 设置唯一约束。如果您不这样做,当您有多个客户插入具有相同汽车值的行时,您将得到重复项。唯一约束将只允许第一个提交成功完成。尝试插入具有相同 car 值(并计算相同的 second_id 值)的行的所有其他并发事务都将失败。显然,您需要通过清理并重试事务来在客户端处理此异常。

关于java - Hibernate 自动生成第二个 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33894439/

相关文章:

java - 如何为我的 GeoTools 项目找到正确的 Java 11 模块名称?

mysql - 为什么此过程会引发 'Unknown Column' 错误

java - 在 GridView Android 中查找元素时需要帮助

java - 如何查找给定字符串中的元音?

php - 检测字符串中的表情符号

php - 使用 AJAX 插入后选择

Java ZonedDateTime 保存在数据库中

java - 使用反射重写java方法

linux - 在 Linux 操作系统 64 位上构建 Hibernate 3.2.0

java - 将 javascript 数组传递给 java servlet