我在oracle中定义了以下操作序列:
CREATE SEQUENCE MySequence
MINVALUE 65536
MAXVALUE 4294967296
START WITH 65536
INCREMENT BY 1
CYCLE
NOCACHE
ORDER;
我想知道如何通过Hibernate(每次请求的下一个值)访问它?(通过JDBC,我使用了getGEnerateKeys)
在另一个需要持久化的实体上使用id之前,我需要它。
感谢
对于Oracle,您应该使用GenerationType.SSEQUENCE
@Id
@GeneratedValue(generator="MySequence", strategy=GenerationType.SEQUENCE)
@SequenceGenerator(allocationSize=1, name="MySequence", sequenceName="MySequence")
编辑:sequencename更新
编辑:请参阅您的评论:您的需求听起来像是使用序列的composite/embedded id(使用多列作为主键)。但不幸的是,这两个解决方案都不支持序列生成器。到目前为止,我可以说;
*您可以通过hibernate创建本机查询,并使用'select mySequence.nextval from dual
追加到索引号。
*或者,您可以创建一个带有新列的oracle视图,该列通过子查询显示序列+索引。
*这个非常实验性,我没有尝试,但你可以使用@formula注释。此处为示例。
我认为只要序列是你的主键-例如
@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就应该自动填充。