【发布时间】:2015-05-25 02:24:03
【问题描述】:
我有一张客户表,每个客户都属于一家公司,公司希望他们的客户编号从 0 开始并随着他们添加客户而增加,当公司 B 添加客户时,公司 A 的客户编号不应该受到影响。 CustomerId 内部可以是任何数字,customerNumber 必须在 companyId 上下文中无间隙递增(无间隙我的意思是 0、1、2、3、4,如果删除 2,它就消失了,下一个插入应该是5 而不是 2)
Example:
companyId customerNumber customerId
0 0 0
0 1 1
0 2 2
0 3 3
0 4 4
0 5 5
1 0 6
1 1 7
1 2 8
我想知道是否有比打开交易、找到最大 customerNumber、使用 max+1 作为 customerNumber 插入条目并关闭交易更好的方法
是否可以使用某种注释来指定生成 customerNumber 的标准?下一个 customerNumber 应该是该公司内可用的最高号码。 (我有大约 20 个其他实体,它们基于日期和 comapnyId 具有类似的人类可读增量 id 要求,我想让 customerNumber 类型字段的生成尽可能简单,我不想记住每次我坚持一个新实体时都这样做)
类似:
@SequenceGenerator(uniqueOver="companyId,customerNumber",strategy=GenerationType.AUTO)
private Long customerNumber;
该解决方案应该符合 ACID,因为我正在处理股票和财务数据。
更新:我已将 id 重命名为 customerId 并将 customerId 重命名为 customerNumber 以防止混淆。
更新: 当我的意思是无间隙时,我的意思是 customerNumbers 应该是 0,1,2,3,4,5,6,7,8,9 - 如果我删除数字 4 它将永远消失,下一个插入应该是 10,除非我创建了一家新公司,那么他们的第一个客户应该从 0 开始。
更新: 我正在使用带有休眠功能的 spring,所以 @PrePersist 注释对我不起作用。如果建议将@PrePersist 作为解决方案,那么它需要在spring 下工作,因此需要对Simon 的问题进行回答:Enable @PrePersist and @PreUpdate in Spring
我不确定的建议答案:
@Entity
@Table(name = "Customer")
public class Customer {
@Table(name = "CustomerNumber")
@Entity(name = "sequenceIdentifier")
public static class CustomerNumberSequenceIdentifier {
@Id
@GenericGenerator(name = "sequence", strategy = "sequence", parameters = {
@org.hibernate.annotations.Parameter(name = "sequenceName", value = "sequence"),
@org.hibernate.annotations.Parameter(name = "allocationSize", value = "1"),
})
@GeneratedValue(generator = "sequence", strategy=GenerationType.SEQUENCE)
private Long id;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long customerId;
@ManyToOne
private Company company;
@GeneratedValue(generator = "sequenceIdentifier", strategy=GenerationType.TABLE)
private Long customerNumber
}
【问题讨论】:
标签: mysql hibernate jpa orm hibernate-mapping