Skip to content

Commit ae7cb66

Browse files
mat3eschauder
authored andcommitted
Ensure version update happens in transaction with insert.
Original pull request #687
1 parent dd846bd commit ae7cb66

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

jdbc/howto/selectiveupdate/src/main/java/example.springdata/jdbc/howto/selectiveupdate/PartyHatRepositoryImpl.java

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import org.springframework.dao.OptimisticLockingFailureException;
1919
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
20+
import org.springframework.transaction.annotation.Transactional;
2021

2122
import java.util.HashMap;
2223
import java.util.Map;
@@ -35,6 +36,7 @@ public PartyHatRepositoryImpl(NamedParameterJdbcOperations template) {
3536
this.template = template;
3637
}
3738

39+
@Transactional
3840
@Override
3941
public void addPartyHat(Minion minion) {
4042

jdbc/howto/selectiveupdate/src/main/java/example.springdata/jdbc/howto/selectiveupdate/SelectiveUpdateApplication.java

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import org.springframework.boot.SpringApplication;
1919
import org.springframework.boot.autoconfigure.SpringBootApplication;
20-
import org.springframework.cache.annotation.EnableCaching;
2120

2221
@SpringBootApplication
2322
class SelectiveUpdateApplication {

jdbc/howto/selectiveupdate/src/test/java/example/springdata/jdbc/howto/selectiveupdate/SelectiveUpdateApplicationTests.java

+20-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void turnPurpleByDirectUpdate() {
5858

5959
Minion bob2 = minions.findById(bob.id).orElseThrow();
6060

61-
assertThat(bob2.toys).containsExactly(bob.toys.toArray(new Toy[] {}));
61+
assertThat(bob2.toys).containsExactlyElementsOf(bob.toys);
6262
assertThat(bob2.name).isEqualTo("Bob");
6363
assertThat(bob2.color).isEqualTo(Color.PURPLE);
6464
}
@@ -81,4 +81,23 @@ void grantPartyHat() {
8181
assertThatExceptionOfType(OptimisticLockingFailureException.class).isThrownBy(() -> minions.addPartyHat(bob));
8282
}
8383

84+
@Test
85+
void cannotGrantPartyHatWhenOutOfSync() {
86+
87+
Minion bob = new Minion("Bob").addToy(new Toy("Tiger Duck")).addToy(new Toy("Security blanket"));
88+
minions.save(bob);
89+
minions.turnPurple(bob.id);
90+
91+
assertThat(bob.color).isEqualTo(Color.YELLOW);
92+
assertThat(bob.version).isOne();
93+
assertThatExceptionOfType(OptimisticLockingFailureException.class).isThrownBy(() -> minions.addPartyHat(bob));
94+
95+
Minion bob2 = minions.findById(bob.id).orElseThrow();
96+
97+
assertThat(bob2.name).isEqualTo("Bob");
98+
assertThat(bob2.color).isEqualTo(Color.PURPLE);
99+
assertThat(bob2.version).isEqualTo(bob.version + 1);
100+
assertThat(bob2.toys).extracting("name").containsExactlyInAnyOrder("Tiger Duck", "Security blanket");
101+
}
102+
84103
}

0 commit comments

Comments
 (0)