假设我有一个只有两列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值)的行的所有其他并发事务将失败。显然,您需要通过清理并重试事务来在客户端中处理此异常。