【发布时间】:2018-06-03 12:30:46
【问题描述】:
我在将新行插入我的 MySQL 数据库时遇到问题。我正在使用 Spring Boot 和 Spring Boot Data JPA。
由于 MySQL 不支持序列,我决定尝试制作自己的序列生成器表。这基本上就是我所做的。
- 我创建了一个
sequences表,该表使用自动增量字段(用作我的表的 ID)。 - 创建了一个函数
sequences_nextvalue(),它插入到sequences表中并返回新的自动递增 id。 - 然后,我在每个表上创建了在插入之前触发的触发器,并将 id 字段替换为调用
sequences_nextvalue()的结果。
所以在插入新行时它工作正常。我在所有表中都获得了唯一的 ID。我遇到的问题与我的 JPA 实体有关。
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractBaseClass {
@Id
private Integer id = -1;
...
}
@Entity
public class ConcreteClass1 extends AbstractBaseClass {
...
}
@Entity
public class ConcreteClass2 extends AbstractBaseClass {
...
}
我希望能够从抽象基类进行查询,因此我将@Id 列放在该类中,并将@Entity 与InheritanceType.TABLE_PER_CLASS 一起使用。我还将 id 初始化为 -1,因为需要一个 id 才能从我的 spring crud 存储库中调用 save()。
在调用我的 Spring 数据 CrudRepository 的 save() 函数后,id 的 -1 正确地被 MySQL 触发器替换,但 save() 返回的结果实体不会返回新的 id,而是而是保留 -1。查看 SQL 日志后,插入后不会调用 select 语句来获取新 id,而是返回原始实体。
当你不使用@GeneratedValue时,是否可以强制Hibnerate在插入后重新选择实体以获取新的id?
非常感谢任何帮助。
【问题讨论】:
-
MySQL 支持 Sequence..stackoverflow.com/questions/26578313/…
-
AUTO_INCREMENT的问题在于它的范围是这样的,因此每个表都有自己的AUTO_INCREMENT字段,允许重叠 id。我想在多个表中拥有唯一的 id,这意味着如果我在SOME_TABLE中的 id 为 1,ANOTHER_TABLE中的 id 不会为 1。所以基本上我想要多个表共享和AUTO_INCREMENT字段。 -
我已经有这个工作但是因为我没有使用
@GeneratedValue,Hibernate 没有执行SELECT它通常在INSERT之后执行所以我没有得到新生成的 idsave()上返回的实体。不过,ID 已正确存储在数据库中。
标签: mysql spring hibernate spring-data