如何分别使用SQL Server和休眠生成每个表的自动递增ID
问题描述:
我想为每个实体分别自动递增ID生成器。如何分别使用SQL Server和休眠生成每个表的自动递增ID
目标数据库是一个SQL Server数据库,我使用的是Hibernate 5.2.4.Final。另外我从代码生成表。
我有一个抽象BaseEntity
和其他像下面的子实体,因此,我的目标是TABLE_PER_CLASS
。
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity {
protected long id;
@Id
@GeneratedValue(strategy = GenerationType.XXX)
@Column(name = "Id")
public long getId() {
return id;
}
}
@Entity
@Table(name = "Tags")
public class Tag extends BaseEntity {
}
下面是我迄今所面临的不同的方案:
- 设置
XXX
到AUTO
:创建一个hibernate_sequence
表在数据库中,我认为,将不提供单独的表不同的ID序列。 - 设置
XXX
至SEQUENCE
:同上。推荐this,同时这样做。 - 设置
XXX
至TABLE
:创建一个hibernate_sequences
表,该表可以为单独的表提供单独的id序列。但是,我发现这是非常昂贵的(与上述参考文献相同),也不是我的首选策略。 - 设置
XXX
至TABLE
:对TABLE_PER_CLASS
不起作用。
我实际上想要使用的是SQL Server的本机标识列。但是,使用SEQUENCE
也是一种选择,但我不确定如何从休眠状态创建和使用每个表。请建议如何实现这两者中的任何一个。
由哈利勒M.答案更新我试图在两种可能的方式:
- 应用上
BaseEntity
- >不创建为每个表单独序列,和而创建ID_SEQNCE
,这在保存每个新实体之前查询。所以,我不确定这与使用GenerationType.TABLE
有什么不同。 - 将其应用于每个单独的实体类 - >在保存时,生成器会创建重复的ID。
答
创建序列使用该
@Id
@GeneratedValue(generator = "ID_SEQ", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "ID_SEQ", sequenceName = "ID_SEQNCE",allocationSize=1)
编辑: 你必须自己做,因为你问在表每班
的不支持ID必须在多个表中共享。因此,当使用此策略的 时,不应使用AUTO或IDENTITY。
更多info
答
使用策略= GenerationType。IDENTITY
简单例子是下面
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
的GenerationType.IDENTITY是最容易使用的,但不是从性能的角度来看最好的一个。它依赖于一个自动递增的数据库列,并允许数据库在每次插入操作时生成一个新值。从数据库的角度来看,这是非常有效的,因为自动增量列是高度优化的,并且不需要任何额外的语句。
谢谢你的回答。但是,它没有按预期工作。请查看更新的问题以获取更多详细信息。 –
更新了我的答案 –