private static final String SEQUENCE = "my_seq";
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE)
@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE)
private Long titId;
这将创建以下架构:
CREATE SEQUENCE my_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1000
CACHE 1;
观察:当我将current value
序列设置为1时,第一个@Id
自动生成的是50
。当我将值设置为时1000
,第一个ID为50000
。
于是,不知何故该序列的当前valuze总是得到 成倍 的50
。为什么?如何防止这种情况,而只使用序列中的nexval?
此行为来自@SequenceGenerator
其参数的默认值50 allocationSize
。您可以根据需要进行更改:
@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE, allocationSize = 42)
private Long titId;
这是出于性能原因。它允许Hibernate预订ID块,并防止每次需要新ID时都询问数据库。
问题内容: 尝试将Hibernate与SAP HANA内存数据库连接时遇到一些性能问题,该数据库不支持AUTO_INCREMENT(http://scn.sap.com/thread/3238906)。 因此,我将Hibernate设置为使用序列进行ID生成。 但是,当我插入大量记录(例如40000)时,Hibernate首先会生成ID。看起来像: 并且只有在生成所有ID之后,它才开始实际插入。
问题内容: 任何人都知道一些有关如何为hibernate创建自定义ID生成器的好教程吗? 问题答案: 在Google上粗略搜索“hibernate自定义ID生成器教程”,发现了以下可能性。我排除了那些看起来没有用的内容,并总结了它们的内容。 http://www.devx.com/Java/Article/30396-涵盖了在数据保留之前生成ID(因此还没有业务密钥)的问题。 http://doc
问题内容: 我的数据库是Oracle,我的id列值是Oracle序列,此序列由触发器执行,因此,在插入每一行之前,此触发器使用此序列来获取id值。因此,我对应该在实体类中定义哪个id策略生成感到困惑。 要么 要么 真的很困惑,有人可以阐明这个话题吗?请清楚解释。 问题答案: 我还有一个projet,其中有一个Oracle DB将数据提供给我的@Entity类。如您所说,序列通过触发器生成表PK的I
问题内容: 是否可以对 不是标识符/不是复合标识符一部分的 某些列使用DB序列? 我正在将hibernate用作jpa提供程序,并且我有一个表,其中包含一些生成的值(使用序列)的列,尽管它们不是标识符的一部分。 我想要的是使用序列为实体创建新值,其中序列的列 不是 主键(的一部分): 然后,当我这样做时: 该ID将被生成,但该属性也将由我的JPA提供程序生成。 为了清楚起见:我希望 Hiberna
问题内容: 我的实体如下。我的数据模型在下面强制执行,因此我无法更改引用的完整性。因此,我陷入了复合键的困境。我想自动生成/使用一些生成器作为orderId 是的,我已经阅读以下内容。 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity- mapping- identifier 我不想管理
问题内容: 假设我在数据库中有一个表“ student”,它很大。学生中有几列,包括“ id”和“ class-id”。 在hbm文件中,我目前具有以下防御者代码: 在这种情况下,如果我更新学生持久性课程,则查询将类似于: 但是出于分区的原因,我还想在查询中包括class-id,例如: 我尝试了Composite-ID,但是发现Composite-ID中不允许使用生成器,因为Composite-I