假设我有一个表,只有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/