javax.persistence.version导致实体的Id在事务中保持为空

javax.persistence.version导致实体的Id在事务中保持为空,java,hibernate,jpa,spring-data-jpa,optimistic-locking,Java,Hibernate,Jpa,Spring Data Jpa,Optimistic Locking,我有两个实体具有典型的主外键关系。EntityA中的id在EntityB中具有外键关系。我试图在同一事务中持久化实体A和实体B Entity A ------------------------------- @Id @GeneratedValue(strategy = IDENTITY) private Long id; @Version private Integer version; Entity B -------------------------------- @ManyToOn

我有两个实体具有典型的主外键关系。EntityA中的id在EntityB中具有外键关系。我试图在同一事务中持久化实体A和实体B

Entity A
-------------------------------
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;

@Version
private Integer version;

Entity B
--------------------------------
@ManyToOne
@JsonBackReference
@JoinColumn(name = "id_fk")
private EntityA entityA;

@Version
private Integer version;
我正在使用javax.persistence.version注释对version列执行乐观锁定。我有两个陈述

   1. entityARepository.save(entityA)
   2. EntityB entityB = generateEntityB(entityA)
   3. entityBRepository.save(entityB)
语句编号3失败,例外情况是实体A id为null,实体A的id为null时无法保存entityB。我尝试在语句1之后使用entityManager.flush,但在遇到第3行时未生成实体A的id


如何更改代码,以便生成并持久化实体A的Id,以便当entityB尝试获取实体A的主键时,该主键不为空?

如果任何人有相同的问题,则Spring数据的Crudepository的保存操作可能会返回完全不同的实体实例,因此您必须执行以下操作

   1. entityA = entityARepository.save(entityA)
   2. EntityB entityB = generateEntityB(entityA)
   3. entityBRepository.save(entityB)

如果您要保存2个实体,请发布实体JPA是围绕类而不是表和用于关联对象的代码,然后发布实际调用的SQL请参见更新的问题。谢谢你在用JPA吗?我想你应该用实体管理器。save方法是否调用entitymanager.persist?我删除了我的第一个问题,因为我使用的是spring数据的Crudepository,所以保存和持久化是一样的。我发现了获取从第1行返回的新对象并将其保存到第2行所需的问题。显然,保存操作会更改实体实例。a充当entitymanager.merge。好啊