我们什么时候需要在Spring中使用.save()实体?

问题描述 投票:1回答:1

在一个相对较大的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

CarPersonEngine都是@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(在视图中打开会话)。

问题是,为什么我需要保存person.getCar()对象?它与我在同一请求处理期间创建的Car对象相同。它何时变为瞬态而不是由持久化上下文管理?我认为所有更改都会自动刷新,因为OSIV已启用。

如何检测这些情况,并确切知道何时使用.save()方法,何时可以忽略它?

hibernate spring-boot spring-data-jpa open-session-in-view
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.