我正在为每个实体尝试单独的自动递增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中的每个表创建和使用一个。请建议如何实现这两者中的任何一个。
更新我尝试了两种方式:
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
。答案 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是最容易使用的,但不是最好的。它依赖于自动递增的数据库列,并允许数据库为每个插入操作生成新值。从数据库的角度来看,这非常有效,因为自动增量列经过了高度优化,并且不需要任何其他语句。