Java JPA将父级与新子级合并

Java JPA将父级与新子级合并,java,jpa,jakarta-ee,persistence,Java,Jpa,Jakarta Ee,Persistence,我有以下结构(OneTONE单向) 问题是,如果我已经有一辆现有的汽车,但没有司机,并且我从数据库向查询的汽车添加了一个司机,那么司机将被插入(我看到生成的插入查询) 以下逻辑发生在事务内部: // this is a raw version of the code that gets executed, skipped validation and stuff like that public void addDriver(long carId, Driver driver) { en

我有以下结构(OneTONE单向)

问题是,如果我已经有一辆现有的汽车,但没有司机,并且我从数据库向查询的汽车添加了一个司机,那么司机将被插入(我看到生成的插入查询)

以下逻辑发生在事务内部:

// this is a raw version of the code that gets executed, skipped validation and stuff like that
public void addDriver(long carId, Driver driver) {
    entityManager.persist(driver);
    Car car = entityManager.find(Car.class, carId);
    car.setDriver(driver);
}
交易完成后,我查询了汽车,但汽车上没有驾驶员。 知道为什么会发生这种情况吗?如何解决

如果您依赖数据库中存在的实体 调用persist(),但在事务提交之前,然后调用 首先刷新()

有关详细信息,请参阅:

如果你尝试

public void addDriver(长carId,Driver-Driver){
Car Car=entityManager.find(Car.class,carId); 设置司机(司机); entityManager.merge(汽车) }


因为您正在级联,所以应该插入并链接汽车。

您的功能是否标记为@Transactional?你能把整个代码显示在你保存对象的地方吗?你能在数据库(和日志)中看到汽车对象的更新吗?标题中提到的“合并”在哪里?我在第一篇文章中说代码是在事务中执行的:)我确实在日志中看到了更新查询。通过合并,我的意思是:更新父实体和子实体之间的关系。如果标题有误导性,对不起。你真的在你的车上叫过merge吗?您显示的代码只会在驾驶员身上保留调用,该调用会被拾取并通过其与汽车的关系保留。因此,虽然这段代码会导致关系更改被拾取,但请检查您的实际代码,看看您是否在find调用后以某种方式清除或放弃更改。可能是因为代码中的某些内容在持久化之后强制刷新,而您的EntityManager未在事务中注册,因此在事务提交时不会刷新?不工作。如果我在同一个事务中再次搜索汽车,在驱动程序被持久化之后,搜索的汽车包含驱动程序。我不知道这条信息是否有用。非常感谢。
// this is a raw version of the code that gets executed, skipped validation and stuff like that
public void addDriver(long carId, Driver driver) {
    entityManager.persist(driver);
    Car car = entityManager.find(Car.class, carId);
    car.setDriver(driver);
}