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

oracle上的hibernate序列@GeneratedValue(strategy = GenerationType.AUTO)

贲绪
2023-03-14
问题内容

我使用@GeneratedValue(strategy = GenerationType.AUTO)在我的实体上生成ID。

我现在不知道它是如何工作的,但是在我的子表上,它会生成遵循父序列的ID值。

//parent table
@Entity
@Table (name = "parent")
public class Parent {

    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    @Column (name = "id")
    private long id;


    @OneToMany (cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
    @JoinColumn (name = "parentId")
    @ForeignKey (name = "FKparent")
    private List<child> child;

}

//child table
@Entity
@Table (name = "child")
public class Child {

    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    @Column (name = "id")
    private long id;
}

在父级上插入的ID值将更新序列。在子级上插入的ID值将更新序列。在下一个父项插入中,序列…使用由子项插入更新的值…

此注释不会创建两个序列,而只会创建一个。这是正确/预期的吗?

我仅使用插入了具有DAO服务的实体 entityManager.persist(parent);


问题答案:

这些注释不会创建两个序列,而只会创建一个。这是正确/预期的吗?

这是预期的行为。使用时@GeneratedValue(strategy = GenerationType.AUTO),JPA提供程序将为特定数据库选择适当的策略。对于Oracle,这将是SEQUENCE,并且由于您未指定任何内容,因此Hibernate将使用名为的单个全局序列hibernate_sequence

这样对吗?好吧,我不知道,这取决于您的需求。以防万一,Oracle序列的默认最大值是1E + 27,或1,000,000,000,000,000,000,000,000,000,000,000。对许多人来说就足够了。

现在,GenerationType.AUTO当数据库使用序列时,可以使用并仍然控制序列的名称:

@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
private Long id;


 类似资料:
  • 例如,如果我希望生成的ID开始为100,XXX而不是10,XXX并增加100,我将如何进行更改? 请帮个忙。提前谢了。

  • 问题内容: 我是新来的hibernate。我不了解以下两种主要的密钥生成策略: 身分识别 序列 有人可以解释这两个是如何工作的,两者之间有什么区别? 问题答案: 引用Java持久性/标识和排序: 身份 排序使用数据库中的 特殊IDENTITY列 来允许数据库在插入对象的行时自动为其分配ID。许多数据库(例如 MySQL,DB2,SQL Server,Sybase和Postgres) 都支持标识列。

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

  • 问题内容: 我正在尝试将对象持久化到数据库。不断获取“列ID无法接受空值错误”。我的对象看起来像这样: 我的持久功能: 问题答案: 您可以使用GenerationType.TABLE。这样,jpa将序列表用于ID分配,您可能永远不需要生成序列或自动递增值或触发可移植性的触发器。 另请注意,在java中,int类型默认使用0初始化,因此您也可以摆脱它。

  • 问题内容: 对于映射到HSQLDB中的表的实体中的id字段,我具有以下定义。 但这似乎不会生成唯一的ID。而是尝试将null插入列中,这将导致失败。如果我手动创建一个序列和生成策略以使用该序列,那么数据将按预期持久保存。 自动生成策略不是暗示提供者(在这种情况下为hibernate)将自动选择正确的方法并根据需要进行所有繁重的工作(创建序列,使用本机方法或适用于该特定平台的任何方法)吗?我的理解不

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