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

Hibernate,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触发器中没有对触发器的html" target="_blank">调用,因为触发器是由数据库管理的。我记得如果我不想遇到问题,必须在数据库中同时拥有序列和触发器。触发器询问要插入的行的id是null还是=0。在这种情况下,将调用LOG_SEQ序列。

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



 类似资料:
  • 问题内容: 我的数据库是Oracle,我的id列值是Oracle序列,此序列由触发器执行,因此,在插入每一行之前,此触发器使用此序列来获取id值。因此,我对应该在实体类中定义哪个id策略生成感到困惑。 要么 要么 真的很困惑,有人可以阐明这个话题吗?请清楚解释。 问题答案: 我还有一个projet,其中有一个Oracle DB将数据提供给我的@Entity类。如您所说,序列通过触发器生成表PK的I

  • 问题内容: 我有一个表,该表的索引自动由使用序列的触发器填充(Oracle数据库) 我有一个匹配的Java类: 当我尝试持久保存A的实例时,如下所示: 我得到这个问题: 保存调用返回的代码中的ID = “ X” 数据库中的ID = “ X + 1” 有没有一种方法可以设置Hibernate来让数据库触发器创建ID? 谢谢 问题答案: HIbernate问题上发现的与Oracle触发器有关的响应,用

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

  • 问题内容: 我正在使用oracle 11g,Java(struts2)和Hibernate开发应用程序。 我有一个名为mytemp的表,其列mytemp_id为NUMBER(22,0)类型。 在我的mytemp.hbm.xml文件中,ID如下所示 在我的Oracle数据库中,创建了名为“ MYTEMP_TEMP_ID_SEQ”的序列,并在Oracle中正常工作。 现在,当我尝试使用hibernat

  • 问题内容: 我使用在我的实体上生成ID。 我现在不知道它是如何工作的,但是在我的子表上,它会生成遵循父序列的ID值。 在父级上插入的ID值将更新序列。在子级上插入的ID值将更新序列。在下一个父项插入中,序列…使用由子项插入更新的值… 此注释不会创建两个序列,而只会创建一个。这是正确/预期的吗? 我仅使用插入了具有DAO服务的实体 ; 问题答案: 这些注释不会创建两个序列,而只会创建一个。这是正确/

  • 这是域对象: 这是测试课程: 这是冬眠。cfg。xml: 这是sql语句(我使用oracle开发人员) 错误这就是错误: 错误:ORA-00923:无法从关键字中找到必需的 异常线程"main"org.hibernate.exception.SQLGrammarExc0019:无法提取结果集org.hibernate.exception.internal.SQLExceptionTypeDeleg