Hibernate自动生成第二个id

时间:2015-11-24 13:02:53

标签: 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类只为test返回一个固定值,但是这个值没有在db中显示,换句话说,它不起作用。

我是怎么做到的? Hibernate对此有所帮助吗?

(我正在使用MySQL db)

2 个答案:

答案 0 :(得分:0)

我不知道这类专栏的任何工具支持。

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

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

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

答案 1 :(得分:0)

在运行时如果没有指定@Id,hibernate将获得异常,我认为你可以改变你的表的结构。