【发布时间】:2019-12-31 20:05:18
【问题描述】:
我正在更新一个现有代码,该代码将一个表中的复制或原始数据处理到同一数据库中的多个对象中。
以前,每种对象都有一个使用每个表的序列生成的 PK。
类似的东西:
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
为了重用导入表中的现有 ID,我们删除了某些实体的 GeneratedValue,如下所示:
@Id
@Column(name = "id")
private Integer id;
对于这个实体,我没有更改我的 JpaRepository,看起来像这样:
public interface EntityRepository extends JpaRepository<Entity, Integer> {
<S extends Entity> S save(S entity);
}
现在我正在努力理解以下行为,在具有默认传播和隔离级别的弹簧事务 (@Transactional) 中:
- 使用实体上的@GeneratedValue,当我调用 entityRepository.save(entity) 时,我可以看到 Hibernate show sql activate 触发了插入请求(但似乎只在缓存中,因为数据库没有改变)
- 如果实体上没有 @GeneratedValue,只会触发一个选择请求(不尝试插入)
当我的实体(没有生成值)以一个或多个关系映射到 MyOtherEntity(有生成值)时,这是一个大问题。
因此我有以下错误:
ERROR: insert or update on table "t_other_entity" violates foreign key constraint "other_entity_entity"
Détail : Key (entity_id)=(110) is not present in table "t_entity"
似乎是合法的,因为没有为实体发送插入,但是为什么呢?同样,如果我更改实体的 ID 并使用 @GeneratedValue 我不会收到任何错误。
我正在使用 Spring Boot 1.5.12、Java 8 和 PostgreSQL 9
【问题讨论】:
标签: java hibernate spring-boot spring-data-jpa spring-data