diff --git a/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/JdbcIndexedSessionRepository.java b/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/JdbcIndexedSessionRepository.java index 11d259cc4..fb941a870 100644 --- a/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/JdbcIndexedSessionRepository.java +++ b/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/JdbcIndexedSessionRepository.java @@ -728,7 +728,8 @@ public T getAttribute(String attributeName) { T attributeValue = supplier.get(); if (attributeValue != null && JdbcIndexedSessionRepository.this.saveMode.equals(SaveMode.ON_GET_ATTRIBUTE)) { - this.delta.put(attributeName, DeltaValue.UPDATED); + this.delta.merge(attributeName, DeltaValue.UPDATED, (oldDeltaValue, + deltaValue) -> (oldDeltaValue == DeltaValue.ADDED) ? oldDeltaValue : deltaValue); } return attributeValue; } diff --git a/spring-session-jdbc/src/test/java/org/springframework/session/jdbc/JdbcIndexedSessionRepositoryTests.java b/spring-session-jdbc/src/test/java/org/springframework/session/jdbc/JdbcIndexedSessionRepositoryTests.java index 63e2bb89b..4260a21af 100644 --- a/spring-session-jdbc/src/test/java/org/springframework/session/jdbc/JdbcIndexedSessionRepositoryTests.java +++ b/spring-session-jdbc/src/test/java/org/springframework/session/jdbc/JdbcIndexedSessionRepositoryTests.java @@ -655,6 +655,20 @@ void saveWithSaveModeOnGetAttribute() { verifyNoMoreInteractions(this.jdbcOperations); } + @Test + void saveWithSaveModeOnGetAttributeAndNewAttributeSetAndGet() { + this.repository.setSaveMode(SaveMode.ON_GET_ATTRIBUTE); + MapSession delegate = new MapSession(); + delegate.setAttribute("attribute1", (Supplier) () -> "value1"); + JdbcSession session = this.repository.new JdbcSession(delegate, UUID.randomUUID().toString(), false); + session.setAttribute("attribute2", "value2"); + session.getAttribute("attribute2"); + this.repository.save(session); + verify(this.jdbcOperations, times(1)).update(startsWith("INSERT INTO SPRING_SESSION_ATTRIBUTES ("), + isA(PreparedStatementSetter.class)); + verifyNoMoreInteractions(this.jdbcOperations); + } + @Test void saveWithSaveModeAlways() { this.repository.setSaveMode(SaveMode.ALWAYS);