假设我有一个只有两列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类只为test返回一个固定值,但是这个值没有在db中显示,换句话说,它不起作用。
我是怎么做到的? Hibernate对此有所帮助吗?
(我正在使用MySQL db)
答案 0 :(得分:0)
我不知道这类专栏的任何工具支持。
您可以使用触发器实现second_id列的值的计算。在插入之前你可能想要一个""触发。触发器将找到正在插入的汽车的现有最大second_id,并为新行的second_id值添加一个。如果允许更新汽车列,则可以支持以相同方式重新计算second_id列(尽管这会在先前汽车值的second_id列的second_id序列中留下漏洞)。
如果您要使用多个维护列值的触发器,您可能会发现创建一个封装业务逻辑的存储过程会更容易。
您还希望在(car,second_id)上设置唯一约束。如果您不这样做,只要您有多个客户端插入具有相同汽车价值的行,您就会得到重复项。唯一约束只允许第一个提交成功完成。尝试插入具有相同car值的行(并计算相同的second_id值)的所有其他并发事务将失败。显然,您需要通过清理和重试事务来在客户端处理此异常。
答案 1 :(得分:0)
在运行时如果没有指定@Id,hibernate将获得异常,我认为你可以改变你的表的结构。