-
Notifications
You must be signed in to change notification settings - Fork 41.5k
Closed as not planned
Closed as not planned
Copy link
Labels
for: external-projectFor an external project and not something we can fixFor an external project and not something we can fixstatus: invalidAn issue that we don't feel is validAn issue that we don't feel is valid
Description
Hi,
I have encountered an issue that occurs in spring-boot-starter-parent 3.2.0 - 3.2.2.
It worked fine in 3.1.8 and 2.7.18.
I have the following structure:
public record Car(@Id Long id,
String reference,
Engine engine) {
}
public record Engine(@Id Long id,
Set<Piston> pistons) {
}
public record Piston(@Id Long id,
String name) {
}
create table public.car
(
id bigint generated by default as identity constraint pk_car primary key,
reference varchar(36) not null constraint uk_car_reference unique,
created_at timestamp with time zone default now()
);
create table public.engine
(
id bigint generated by default as identity constraint pk_engine primary key,
car bigint not null constraint fk_engine_car references public.car,
created_at timestamp with time zone default now()
);
create table public.piston
(
id bigint generated by default as identity constraint pk_piston primary key,
engine bigint not null constraint fk_piston_engine references public.engine,
name text not null,
created_at timestamp with time zone default now()
);
Create a Car without an engine to cause the id column in the engine table to always be different from the car id.
INSERT INTO public.car (id, reference) VALUES (1, 'no engine');
This is the repository that uses CrudRepository:
@Repository
public interface EngineTroubleRepository extends CrudRepository<Car, Long> {
Optional<Car> findByReference(String reference);
}
This code creates a new Car;
final var car = new Car(
null,
carReferenceProvider.get(),
new Engine(
null,
Set.of(
new Piston(
null,
"piston1"
),
new Piston(
null,
"piston2"
),
new Piston(
null,
"piston3"
)
)
));
engineTroubleRepository.save(car);
Next, I use a find to lookup the same Car. The save causes the pistons to be deleted.
final var car = engineTroubleRepository.findByReference(carReference).orElseThrow(() -> Problem.builder()
.withStatus(NOT_FOUND.value())
.withTitle("car not found")
.withDetail("No car with id [%s] could be found.", carReference)
.buildException());
engineTroubleRepository.save(car);
I think this happens:
the findByReference does a SELECT on Car, and subsequently on Engine. When selecting pistons, it takes the Car.id, instead of the Engine.id. The resulting Engine object does not have Pistons, and when doing the save(), al the pistons in the database get deleted.
Metadata
Metadata
Assignees
Labels
for: external-projectFor an external project and not something we can fixFor an external project and not something we can fixstatus: invalidAn issue that we don't feel is validAn issue that we don't feel is valid