我在 oracle 中定义了以下序列:
CREATE SEQUENCE MySequence
MINVALUE 65536
MAXVALUE 4294967296
START WITH 65536
INCREMENT BY 1
CYCLE
NOCACHE
ORDER;
我想知道如何通过 Hibernate 访问它(每次我请求的下一个值)?(通过 JDBC 我使用了 getGEnerateKeys)
在需要持久化的另一个实体上使用它之前,我需要该 id。
谢谢
我认为只要序列是您的主键 - 例如
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
然后当你运行:
Integer id = (Integer)session.save(obj);
它将返回 id。
请参阅 Javadoc:http ://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html#save(java.lang.Object )
没有 JPA 标准的方法可以做到这一点,但如果您确实需要,您当然可以访问底层 JDBC 连接。但请注意,一旦实体被持久化,实体的 ID 应该会自动填充。
对于 Oracle,您应该使用GenerationType.SEQUENCE
@Id
@GeneratedValue(generator="MySequence", strategy=GenerationType.SEQUENCE)
@SequenceGenerator(allocationSize=1, name="MySequence", sequenceName="MySequence")
编辑:序列名称已更新
编辑:参考您的评论:您的要求听起来像使用序列的复合/嵌入 id(使用多列作为主键)。但不幸的是,这两种解决方案都不支持序列生成器。到目前为止,我可以说;
*您可以通过休眠创建本机查询并使用 ' 附加到索引号select mySequence.nextval from dual
。
*或者您可以使用通过子查询显示序列+索引的新列创建一个 oracle 视图。
*这是一个非常实验性的,我没有尝试,但你可以使用 @formula 注释。这里的例子。