如何使用SQL Server和Hibernate

时间:2016-11-23 09:50:41

标签: java sql-server hibernate

我正在为每个实体尝试单独的自动递增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也是一种选择,但我不确定如何为hibernate中的每个表创建和使用一个。请建议如何实现这两者中的任何一个。

关于Khalil M.答案的

更新我尝试了两种方式:

  1. 申请BaseEntity - >不为每个表创建单独的序列,而是创建ID_SEQNCE,在保存每个新实体之前查询该GenerationType.TABLE。所以,我不确定这与使用SELECT T1.AC_NO FROM TALE1 T1 INNER JOIN TABLE2 T2 ON T1.AC_NO= CASE WHEN T2.COMMON_KEY LIKE '%~%' AND T2.COMMON_KEY IS NOT NULL THEN GET_VALUE_VARCHAR(ARRAY_SPLIT(T2.COMMON_KEY,'~'),2) ELSE T2.COMMON_KEY END
  2. 有什么不同
  3. 将其应用于每个单独的实体类 - >保存时,生成器会创建重复的ID。

2 个答案:

答案 0 :(得分:0)

用于创建序列使用此

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

编辑: 您必须自己制作,因为每个班级的表格

不支持您的要求
  

必须在多个表之间共享id。因此,何时   使用此策略,您不应使用AUTO或IDENTITY。

了解更多info

答案 1 :(得分:0)

使用策略= GenerationType.IDENTITY

下面是一个简短的例子

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

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

private Long id;

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