我在oracle中定义了以下序列:
CREATE SEQUENCE MySequence
MINVALUE 65536
MAXVALUE 4294967296
START WITH 65536
INCREMENT BY 1
CYCLE
NOCACHE
ORDER;
我想知道如何通过Hibernate访问它(每次我请求的下一个值)? (通过JDBC我使用了getGEnerateKeys)
在我将其用于需要保留的另一个实体之前,我需要id。
由于
答案 0 :(得分:1)
我认为只要序列是您的主键 - 例如
@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)
答案 1 :(得分:1)
没有JPA标准的方法,但如果你真的需要,你当然可以访问底层的JDBC连接。但请注意,一旦实体被持久化,实体的ID应自动填充。
答案 2 :(得分:1)
对于Oracle,您应该使用 GenerationType.SEQUENCE
@Id
@GeneratedValue(generator="MySequence", strategy=GenerationType.SEQUENCE)
@SequenceGenerator(allocationSize=1, name="MySequence", sequenceName="MySequence")
编辑:序列名已更新
编辑:参考你的评论: 您的要求听起来像使用序列的composit / embedded id(使用多列作为主键)。但不幸的是,这两种解决方案都不支持序列生成器到目前为止,我可以说;
*您可以通过休眠创建本机查询,并使用“select mySequence.nextval from dual
附加到索引编号。
*或者您可以使用新列创建oracle视图,该列通过子查询显示序列+索引。
*这个非常实验性,我没有尝试,但你可以使用@formula注释。示例here。