如何分别使用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 { 
} 

下面是我迄今所面临的不同的方案:

  • 设置XXXAUTO:创建一个hibernate_sequence表在数据库中,我认为,将不提供单独的表不同的ID序列。
  • 设置XXXSEQUENCE:同上。推荐this,同时这样做。
  • 设置XXXTABLE:创建一个hibernate_sequences表,该表可以为单独的表提供单独的id序列。但是,我发现这是非常昂贵的(与上述参考文献相同),也不是我的首选策略。
  • 设置XXXTABLE:对TABLE_PER_CLASS不起作用。

我实际上想要使用的是SQL Server的本机标识列。但是,使用SEQUENCE也是一种选择,但我不确定如何从休眠状态创建和使用每个表。请建议如何实现这两者中的任何一个。

由哈利勒M.答案更新我试图在两种可能的方式:

  1. 应用上BaseEntity - >不创建为每个表单独序列,和而创建ID_SEQNCE,这在保存每个新实体之前查询。所以,我不确定这与使用GenerationType.TABLE有什么不同。
  2. 将其应用于每个单独的实体类 - >在保存时,生成器会创建重复的ID。

创建序列使用该

@Id 
    @GeneratedValue(generator = "ID_SEQ", strategy = GenerationType.SEQUENCE) 
    @SequenceGenerator(name = "ID_SEQ", sequenceName = "ID_SEQNCE",allocationSize=1) 

编辑: 你必须自己做,因为你问在表每班

的不支持ID必须在多个表中共享。因此,当使用此策略的 时,不应使用AUTO或IDENTITY。

更多info

+0

谢谢你的回答。但是,它没有按预期工作。请查看更新的问题以获取更多详细信息。 –

+0

更新了我的答案 –

使用策略= GenerationType。IDENTITY

简单例子是下面

@Id 

@GeneratedValue(strategy = GenerationType.IDENTITY) 

@Column(name = "id", updatable = false, nullable = false) 

private Long id; 

的GenerationType.IDENTITY是最容易使用的,但不是从性能的角度来看最好的一个。它依赖于一个自动递增的数据库列,并允许数据库在每次插入操作时生成一个新值。从数据库的角度来看,这是非常有效的,因为自动增量列是高度优化的,并且不需要任何额外的语句。