【问题标题】:Retrieve Oracle Sequence via Hibernate通过 Hibernate 检索 Oracle 序列
【发布时间】:2012-08-21 08:24:30
【问题描述】:

我在 oracle 中定义了以下序列:

CREATE SEQUENCE MySequence
MINVALUE 65536 
MAXVALUE 4294967296 
START WITH 65536
INCREMENT BY 1
CYCLE
NOCACHE
ORDER;

我想知道如何通过 Hibernate 访问它(每次我请求的下一个值)? (通过 JDBC 我使用了 getGEnerateKeys)

在将其用于需要持久化的另一个实体之前,我需要该 id。

谢谢

【问题讨论】:

    标签: java oracle hibernate


    【解决方案1】:

    对于 Oracle,您应该使用 GenerationType.SEQUENCE

      @Id
        @GeneratedValue(generator="MySequence", strategy=GenerationType.SEQUENCE)
        @SequenceGenerator(allocationSize=1, name="MySequence", sequenceName="MySequence")
    

    编辑:序列名称已更新

    编辑:参考您的评论: 您的要求听起来像使用序列的复合/嵌入 id(使用多列作为主键)。但不幸的是,这两种解决方案都不支持序列生成器。到目前为止,我可以说;

    *您可以通过 hibernate 创建本机查询并使用 'select mySequence.nextval from dual 附加到索引号。

    *或者您可以使用通过子查询显示序列+索引的新列创建一个 oracle 视图。

    *这是一个非常实验性的,我没有尝试,但你可以使用@formula 注释。示例here

    【讨论】:

    • 我不需要序列来将其用作 Id。我需要这个序列,因为某些拥有自己的 Id 的实体需要有这个,我们称之为“索引”,它是 x 和 y 之间的数字。所以代码将是一些东西:给我序列中的下一个值并设置为实体然后保存。 (因此实体将拥有自己的 id)
    • 也许我不是很清楚......我在 oracle 上定义的序列中的这个值不是实体的 Id,它只是我想将它设置为实体的值(实体有它自己的 id 可能是通过另一个序列)
    【解决方案2】:

    我认为只要序列是你的主键——例如

    @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)

    【讨论】:

    • 谢谢...请看我上面的评论。
    【解决方案3】:

    没有 JPA 标准的方法可以做到这一点,但如果您确实需要,您当然可以访问底层 JDBC 连接。但请注意,一旦实体被持久化,实体的 ID 应该会自动填充。

    【讨论】:

    • 谢谢...请看我上面的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2013-11-04
    • 2012-02-24
    • 1970-01-01
    • 2014-05-12
    • 2013-07-13
    相关资源
    最近更新 更多