我正在更新现有代码,该代码处理从一个表到同一数据库中多个对象的复制或原始数据。
以前,每种对象都有一个使用每个表的序列生成的 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);
}
现在,我正在努力理解具有默认传播和隔离级别的 spring 事务 (@Transactional) 中的以下行为:
通过实体上的@GenerateValue,当我调用entityRepository.save(entity)时,我可以看到Hibernate显示sql激活了一个插入请求被触发(但是似乎只在缓存中,因为数据库没有改变)
如果实体上没有 @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
万千封印
相关分类