spring-data-r2dbc icon indicating copy to clipboard operation
spring-data-r2dbc copied to clipboard

Bug: different behaviour between save(save(x)), and save(find(save(x)))

Open fedpet opened this issue 1 year ago • 2 comments
trafficstars

this code

x = repository.save(x);
x = repository.findById(x.id)
x = repository.save(x);

behaves the expected way, while this one:

x = repository.save(x);
x = repository.save(x);

will generate an update query that tries to set all fields, even untouched null fields.

So imagine you have a COLUMN c NOT NULL DEFAULT 'bla'. The first example will correctly leave c to default since it's never touched. Se second example will unexpectedly try to update c and set it to null, and the DB will throw an exception.

fedpet avatar May 08 '24 07:05 fedpet

This is expected as calling save once inserts the object, the second call yields an update as the identifier is populated.

We do not track dirty state and we do not insert null fields. For the update case, we must provide null values to the update to reflect the entity state in the database as we do not track any changes.

Another aspect here is that we do only retrieve the generated identifier. Any default values that come from the database aren't transmitted back by the insert statement. So if you generate values in your database and want to see these, then load-after-save is the only viable approach.

mp911de avatar May 08 '24 07:05 mp911de

If you would like us to look at this issue, please provide the requested information. If the information is not provided within the next 7 days this issue will be closed.

spring-projects-issues avatar May 15 '24 08:05 spring-projects-issues

Closing due to lack of requested feedback. If you would like us to look at this issue, please provide the requested information and we will re-open the issue.

spring-projects-issues avatar May 22 '24 08:05 spring-projects-issues