JPA 将父级与新子级合并



>我有以下结构(一对一单向)

@Entity
public class Car {
    @Id
    @Column(name = ID)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @OneToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true )
    @JoinColumn(name = "DRIVER_ID")
    private Driver driver;
    // setters and getters and other properties
}
@Entity
public class Driver {
    @Id
    @Column(name = ID)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    // setters and getters and other properties
}

问题是,如果我已经有一辆现有的汽车,但没有驱动程序,并且我从数据库中将驱动程序添加到查询的汽车中,则将插入驱动程序(我看到生成的插入查询)。

以下逻辑发生在事务中:

// 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(),但在事务提交之前,然后调用 同花顺() 第一。

有关详细信息,请参阅以下内容:

http://blakecaldwell.net/blog/2013/9/3/dont-rely-on-entitymanagerpersist-for-immediate-insert.html

如果你尝试

public void addDriver(long carId, Driver driver) {
Car car = entityManager.find(Car.class, carId); car.setDriver(driver); entityManager.merge(car) }

因为你是级联的,所以应该插入和链接汽车。

最新更新