diff --git a/spring-session/src/main/java/org/springframework/session/jdbc/JdbcOperationsSessionRepository.java b/spring-session/src/main/java/org/springframework/session/jdbc/JdbcOperationsSessionRepository.java index 7664f624..48556a60 100644 --- a/spring-session/src/main/java/org/springframework/session/jdbc/JdbcOperationsSessionRepository.java +++ b/spring-session/src/main/java/org/springframework/session/jdbc/JdbcOperationsSessionRepository.java @@ -287,23 +287,25 @@ public class JdbcOperationsSessionRepository implements } }); - final List attributeNames = new ArrayList(session.getAttributeNames()); - JdbcOperationsSessionRepository.this.jdbcOperations.batchUpdate( - getQuery(CREATE_SESSION_ATTRIBUTE_QUERY), - new BatchPreparedStatementSetter() { + if (!session.getAttributeNames().isEmpty()) { + final List attributeNames = new ArrayList(session.getAttributeNames()); + JdbcOperationsSessionRepository.this.jdbcOperations.batchUpdate( + getQuery(CREATE_SESSION_ATTRIBUTE_QUERY), + new BatchPreparedStatementSetter() { - public void setValues(PreparedStatement ps, int i) throws SQLException { - String attributeName = attributeNames.get(i); - ps.setString(1, session.getId()); - ps.setString(2, attributeName); - serialize(ps, 3, session.getAttribute(attributeName)); - } + public void setValues(PreparedStatement ps, int i) throws SQLException { + String attributeName = attributeNames.get(i); + ps.setString(1, session.getId()); + ps.setString(2, attributeName); + serialize(ps, 3, session.getAttribute(attributeName)); + } - public int getBatchSize() { - return attributeNames.size(); - } + public int getBatchSize() { + return attributeNames.size(); + } - }); + }); + } } }); diff --git a/spring-session/src/test/java/org/springframework/session/jdbc/JdbcOperationsSessionRepositoryTests.java b/spring-session/src/test/java/org/springframework/session/jdbc/JdbcOperationsSessionRepositoryTests.java index f56cd732..f82a79ee 100644 --- a/spring-session/src/test/java/org/springframework/session/jdbc/JdbcOperationsSessionRepositoryTests.java +++ b/spring-session/src/test/java/org/springframework/session/jdbc/JdbcOperationsSessionRepositoryTests.java @@ -32,6 +32,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.PreparedStatementSetter; import org.springframework.jdbc.core.ResultSetExtractor; @@ -55,6 +56,7 @@ import static org.mockito.Matchers.startsWith; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; /** @@ -178,7 +180,7 @@ public class JdbcOperationsSessionRepositoryTests { } @Test - public void saveNew() { + public void saveNewWithoutAttributes() { JdbcOperationsSessionRepository.JdbcSession session = this.repository .createSession(); @@ -188,6 +190,24 @@ public class JdbcOperationsSessionRepositoryTests { assertPropagationRequiresNew(); verify(this.jdbcOperations, times(1)).update(startsWith("INSERT"), isA(PreparedStatementSetter.class)); + verifyNoMoreInteractions(this.jdbcOperations); + } + + @Test + public void saveNewWithAttributes() { + JdbcOperationsSessionRepository.JdbcSession session = this.repository + .createSession(); + session.setAttribute("testName", "testValue"); + + this.repository.save(session); + + assertThat(session.isNew()).isFalse(); + assertPropagationRequiresNew(); + verify(this.jdbcOperations, times(1)).update(startsWith("INSERT"), + isA(PreparedStatementSetter.class)); + verify(this.jdbcOperations, times(1)).batchUpdate( + and(startsWith("INSERT"), contains("ATTRIBUTE_BYTES")), + isA(BatchPreparedStatementSetter.class)); } @Test