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

id | car

1 | 200

2 | 200

3 | 201

4 | 201

5 | 201

6 | 202


我需要一个新列,当插入新记录时,该列会自动生成按汽车分组的第二个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类仅返回一个固定值进行测试,但是该值未在db中显示,换句话说,它不起作用。

我该怎么做?
休眠有什么用吗?

(我正在使用MySQL数据库)

最佳答案

我不知道这种列有任何工具支持。

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

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

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

10-07 19:38
查看更多