【问题标题】:Oracle JPA GenerationType.AUTO with generator asks for "hibernate_sequence"带有生成器的 Oracle JPA GenerationType.AUTO 请求“hibernate_sequence”
【发布时间】:2016-09-09 14:35:49
【问题描述】:

我正在尝试在 Oracle JPA 中使用定义的序列生成,以及像这样的 GenerationType.AUTO:

@Id
@SequenceGenerator(name = "MY_GEN_NAME", sequenceName = "MY_SQ_NAME")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "MY_GEN_NAME")
@Column(name = "ID", nullable = false)
private Long id;

运行休眠验证后会抛出错误:

架构验证:缺少序列 [hibernate_sequence]

我猜,它忽略了我的MY_GEN_NAME 并试图使用该全局序列来生成 id。

当我切换到GenerationType.SEQUENCE 时,它使用SequenceHiLoGenerator 并且工作正常。

为什么会发生这种情况,是否可以让GenerationType.AUTO 使用给定的 Oracle 序列(可以切换到其他数据库)?

【问题讨论】:

  • 我认为oracle没有这个功能。没有“真正的”自动增量功能。你必须使用一个序列。
  • 等等。我认为您没有正确理解我的问题。我不想使用“自动增量”。我想使用我自己定义的序列和GenerationType.AUTO。假设我只读取了创建序列的 Oracle DB,但在实现中我必须准备好切换到 MySQL(这就是为什么AUTO,而不是SEQUENCE)。但是,当我使用 AUTO 时 - 即使我告诉 JPA 使用什么序列,它仍然会寻找或尝试创建该全局 hibernate_sequence

标签: java oracle hibernate jpa


【解决方案1】:

AUTO 对 JPA 提供者说,“选择你想要的”,在这种情况下它不会使用“生成器”属性。

如果您想使用 SEQUENCE,请将策略设置为SEQUENCE!这样它将使用您定义的序列定义

【讨论】:

  • 那篇帖子stackoverflow.com/a/3068856/2630520 怎么样。我刚刚找到它。是否具有误导性?
  • 它完全符合我刚才所说的......您选择自动,然后将其留给 JPA 提供者来决定。如果您将“AUTO”与不同的 JPA 提供程序一起使用,您可以使用例如 TABLE 生成器或其他方式来获取它。
  • 我的意思是那部分:“现在,当数据库使用序列时,可以使用 GenerationType.AUTO 并且仍然控制序列的名称:”我确实像示例中的代码所说的和序列仍然是“hibernate_sequence”——这是不想要的。
  • 您正在尝试使用不在您的 JPA 提供者文档中的东西,将来很容易发生变化(如果它曾经有效的话),并且发布的人甚至不是那个的开发者软件。因此,您可以得出结论,这是完全不可靠的。
  • 关键是我在我应该重构的代码中拥有它。它又大又旧,但很多人说它有效。 White 我不能将它与他们提供的 db 模式一起使用。我试图弄清楚为什么他们使用 AUTO 和@SequenceGenerator,但它显然不起作用。无论如何感谢您的帮助。
【解决方案2】:

虽然hibernate-sequence-on-oracle-generatedvaluestrategy-generationtype-auto 建议这会起作用,但似乎某些版本的 Hibernate 已损坏,请参阅HHH-10656

编辑:在 5.2.0 中损坏,在 5.2.8 中未损坏。

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 2018-01-22
    • 2019-01-11
    • 2013-11-01
    • 2016-04-21
    • 2015-12-10
    • 2020-12-15
    • 1970-01-01
    • 2012-03-22
    相关资源
    最近更新 更多