当前位置: 首页 > 面试题库 >

休眠,id,oracle,序列

谯振国
2023-03-14
问题内容

我的数据库是Oracle,我的id列值是Oracle序列,此序列由触发器执行,因此,在插入每一行之前,此触发器使用此序列来获取id值。因此,我对应该在实体类中定义哪个id策略生成感到困惑。

@GenericGenerator(name = "generator", strategy = "increment")
@Id
@GeneratedValue(generator = "generator")

要么

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "idGenerator")
@SequenceGenerator(name="idGenerator", sequenceName="ID_SEQ")

要么

@Id
@GeneratedValue(strategy = GenerationType.AUTO)

真的很困惑,有人可以阐明这个话题吗?请清楚解释。


问题答案:

我还有一个projet,其中有一个Oracle
DB将数据提供给我的@Entity类。如您所说,序列通过触发器生成表PK的ID。这是我在这些类之一中使用的注释:

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "G1")
@SequenceGenerator(name = "G1", sequenceName = "LOG_SEQ")
@Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)
public int getId() {
    return this.id;
}

这是您的帖子中显示的第二种语法。由于触发器是由数据库管理的,因此Java代码中没有对触发器的调用。我记得,如果我不想遇到问题,则必须在数据库中同时拥有序列和触发器。触发器询问要插入的行的id是null还是=0。在这种情况下,将调用LOG_SEQ序列。

因此,如果您为实体的@Id提供值,则可以将其插入数据库(如果该ID不存在),则不会调用该序列。尝试查看触发器的代码以确切了解其发生的情况。



 类似资料:
  • 问题内容: 是否可以对 不是标识符/不是复合标识符一部分的 某些列使用DB序列? 我正在将hibernate用作jpa提供程序,并且我有一个表,其中包含一些生成的值(使用序列)的列,尽管它们不是标识符的一部分。 我想要的是使用序列为实体创建新值,其中序列的列 不是 主键(的一部分): 然后,当我这样做时: 该ID将被生成,但该属性也将由我的JPA提供程序生成。 为了清楚起见:我希望 Hiberna

  • 问题内容: 尝试将Hibernate与SAP HANA内存数据库连接时遇到一些性能问题,该数据库不支持AUTO_INCREMENT(http://scn.sap.com/thread/3238906)。 因此,我将Hibernate设置为使用序列进行ID生成。 但是,当我插入大量记录(例如40000)时,Hibernate首先会生成ID。看起来像: 并且只有在生成所有ID之后,它才开始实际插入。

  • 问题内容: 我已将hibernate配置为使用oracle序列。使用cache = 20,increment = 1创建序列。 一切正常,hibernate持久实体。id值很奇怪:50,51 .... 76,201,202 … 209,1008,1009,5129,5130 .... 如果我要求序列值(从双重选择hibernate_sequence.nextval),我会得到像2,3,4 …的值。

  • 问题内容: 任何人都知道一些有关如何为hibernate创建自定义ID生成器的好教程吗? 问题答案: 在Google上粗略搜索“hibernate自定义ID生成器教程”,发现了以下可能性。我排除了那些看起来没有用的内容,并总结了它们的内容。 http://www.devx.com/Java/Article/30396-涵盖了在数据保留之前生成ID(因此还没有业务密钥)的问题。 http://doc

  • 问题内容: 我有一个使用hibernate和注解的j2ee应用程序。我如何注释我的pojo类中的Id字段以将其设置为自动增量或自动生成。在添加bean时,我是否将该字段留在bean中为null? 问题答案: 并在保留时将其保留为()。(如果使用/ 包装器) 在某些情况下,该策略被解析为to 或to ,因此您可能需要手动将其设置为or (取决于基础数据库)。 似乎 + 指定序列名称 对您有用。

  • 问题内容: 这将创建以下架构: 观察:当我将序列设置为1时,第一个自动生成的是。当我将值设置为时,第一个ID为。 于是,不知何故该序列的当前valuze总是得到 成倍 的。为什么?如何防止这种情况,而只使用序列中的nexval? 问题答案: 此行为来自其参数的默认值50 。您可以根据需要进行更改: 这是出于性能原因。它允许Hibernate预订ID块,并防止每次需要新ID时都询问数据库。