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

CarPersonおよび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同じリクエスト処理中に作成したオブジェクトと同じです。どの時点で一時的になり、永続化コンテキストによって管理されなくなりますか? OSIVが有効になっているため、すべての変更が自動的にフラッシュされると思いました。

このようなケースをどのように検出し、メソッドをいつ使用し、いつ無視できるかを正確に知るにはどうすればよいですか?.save()

4

1 に答える 1