【发布时间】:2019-04-19 21:58:29
【问题描述】:
在一个相对较大的 Spring Boot 项目中,我有一个方法具有以下(过于简化)事件序列:
Car car = carRepository.save(new Car());
Person person = personRepository.save(new Person(car)); // Car is a field of Person
Engine engine = engineRepository.save(new Engine());
person.getCar().setEngine(engine);
carRepository.save(person.getCar()); // without this the engine and car relation is not registered
Car、Person 和 Engine 都是 @Entity 类(数据库对象)。对于此示例,它们的实现可能如下:
// Car.java
@Entity
@Table(name = "car_tbl")
public class Car {
@Id
@GeneratedValue
@Column(name = "car_id")
private Long id;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "engine_id", unique = true)
private Engine engine;
}
// Person.java
@Entity
@Table(name = "person_tbl")
public class Person {
@Id
@GeneratedValue
@Column(name = "person_id")
private Long id;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "car_id", nullable = false, unique = true)
private Car car;
}
// Engine.java
@Entity
@Table(name = "engine_tbl")
public class Engine {
@Id
@GeneratedValue
@Column(name = "engine_id")
private Long id;
}
上述方法仅在 REST API 方法内部使用。 并且在配置属性中启用了 OSIV(Open Session In View)。
问题是,为什么我需要保存person.getCar() 对象?它与我刚刚在同一请求处理期间创建的 Car 对象相同。什么时候它会变成 transient 而不是 managed 由持久性上下文?我认为所有更改都会自动刷新,因为启用了 OSIV。
如何检测此类情况并确切了解何时使用.save() 方法以及何时可以忽略它?
【问题讨论】:
-
我猜最后一行是
carRepository.save(,而不是engineRepository -
引擎是否有 Car 作为依赖项?以 OneToOne 为例
-
Engine没有任何依赖关系。
标签: hibernate spring-boot spring-data-jpa open-session-in-view