>我有以下结构(一对一单向)
@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)
}
因为你是级联的,所以应该插入和链接汽车。