Hibernate,id,oracle,sequence
我的数据库是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; }
这是您在post中显示的第二种语法。 Java代码中没有调用触发器,因为触发器由DB管理。 我记得如果我不想遇到问题,我必须在数据库中同时拥有序列和触发器。 触发器询问要插入的行的id是否为null或= 0.在这种情况下,将调用序列LOG_SEQ。
因此,如果您为实体的@Id提供一个值,它可以插入到DB中(如果该Id不存在),则不会调用该序列。 尝试查看触发器的代码,以确切了解它发生了什么。
- 如何将Hibernate NamingStrategy迁移到(隐式|物理)NamingStrategy? 文件在哪里?
- 使用hibernate更新数据库模式
- Hibernate JPA ManyToOne复合键
- 使用Spring Hibernate Template时检测重复项的最佳方法
- PostgreSQL串行类型的Hibernate注释
- 无法初始化代理 – 没有会话
- 使用Spring Boot和Logback无法避免hibernate将SQL记录到控制台
- ORM:Non Primary-Key Join列上的OneToOne映射 – 按ISBN映射的Book和Inventory
- Hibernate使用条件执行更新