Skip to content

Commit 0b4af0c

Browse files
authored
Merge pull request eugenp#8083 from alimate/BAEL-3334
[BAEL 3334] Open Session in View Code
2 parents cc96439 + 979d4f9 commit 0b4af0c

File tree

11 files changed

+230
-41
lines changed

11 files changed

+230
-41
lines changed

persistence-modules/spring-data-jpa-3/pom.xml

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,22 @@
1818
<dependencies>
1919

2020
<!-- Prod Dependencies -->
21+
<dependency>
22+
<groupId>org.springframework.boot</groupId>
23+
<artifactId>spring-boot-starter-web</artifactId>
24+
</dependency>
2125
<dependency>
2226
<groupId>org.springframework.boot</groupId>
2327
<artifactId>spring-boot-starter-data-jpa</artifactId>
2428
</dependency>
2529
<dependency>
26-
<groupId>org.postgresql</groupId>
27-
<artifactId>postgresql</artifactId>
28-
<version>${postgresql.version}</version>
30+
<groupId>com.h2database</groupId>
31+
<artifactId>h2</artifactId>
32+
<scope>runtime</scope>
33+
<version>${h2.version}</version>
2934
</dependency>
3035

3136
<!-- Test Dependencies -->
32-
<dependency>
33-
<groupId>org.testcontainers</groupId>
34-
<artifactId>junit-jupiter</artifactId>
35-
<version>${testcontainers.version}</version>
36-
<scope>test</scope>
37-
</dependency>
38-
<dependency>
39-
<groupId>org.testcontainers</groupId>
40-
<artifactId>postgresql</artifactId>
41-
<version>${testcontainers.version}</version>
42-
<scope>test</scope>
43-
</dependency>
4437
<dependency>
4538
<groupId>org.springframework.boot</groupId>
4639
<artifactId>spring-boot-starter-test</artifactId>
@@ -71,8 +64,7 @@
7164
</dependencies>
7265

7366
<properties>
74-
<testcontainers.version>1.12.2</testcontainers.version>
75-
<postgresql.version>42.2.8</postgresql.version>
67+
<h2.version>1.4.200</h2.version>
7668
</properties>
7769

7870
</project>

persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/tx/Payment.java renamed to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/model/Payment.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.baeldung.tx;
1+
package com.baeldung.model;
22

33
import javax.persistence.*;
44

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.baeldung.model;
2+
3+
import javax.persistence.*;
4+
import java.util.Set;
5+
6+
@Entity
7+
@Table(name = "users")
8+
public class User {
9+
10+
@Id
11+
@GeneratedValue
12+
private Long id;
13+
14+
private String username;
15+
16+
@ElementCollection
17+
private Set<String> permissions;
18+
19+
public Long getId() {
20+
return id;
21+
}
22+
23+
public void setId(Long id) {
24+
this.id = id;
25+
}
26+
27+
public String getUsername() {
28+
return username;
29+
}
30+
31+
public void setUsername(String username) {
32+
this.username = username;
33+
}
34+
35+
public Set<String> getPermissions() {
36+
return permissions;
37+
}
38+
39+
public void setPermissions(Set<String> permissions) {
40+
this.permissions = permissions;
41+
}
42+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.baeldung.repository;
2+
3+
import com.baeldung.model.User;
4+
import org.springframework.data.jpa.repository.EntityGraph;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
7+
import java.util.Optional;
8+
9+
public interface UserRepository extends JpaRepository<User, Long> {
10+
11+
@EntityGraph(attributePaths = "permissions")
12+
Optional<User> findDetailedByUsername(String username);
13+
14+
Optional<User> findSummaryByUsername(String username);
15+
16+
Optional<User> findByUsername(String username);
17+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.baeldung.service;
2+
3+
import com.baeldung.model.User;
4+
import com.baeldung.repository.UserRepository;
5+
import org.springframework.stereotype.Service;
6+
import org.springframework.transaction.annotation.Transactional;
7+
8+
import java.util.Optional;
9+
10+
@Service
11+
public class SimpleUserService implements UserService {
12+
13+
private final UserRepository userRepository;
14+
15+
public SimpleUserService(UserRepository userRepository) {
16+
this.userRepository = userRepository;
17+
}
18+
19+
@Override
20+
@Transactional(readOnly = true)
21+
public Optional<User> findOne(String username) {
22+
return userRepository.findDetailedByUsername(username);
23+
}
24+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.baeldung.service;
2+
3+
import com.baeldung.model.User;
4+
5+
import java.util.Optional;
6+
7+
public interface UserService {
8+
Optional<User> findOne(String username);
9+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.baeldung.web;
2+
3+
import com.baeldung.model.User;
4+
5+
import java.util.Set;
6+
7+
public class DetailedUserDto {
8+
9+
private Long id;
10+
private String username;
11+
private Set<String> permissions;
12+
13+
public Long getId() {
14+
return id;
15+
}
16+
17+
public void setId(Long id) {
18+
this.id = id;
19+
}
20+
21+
public String getUsername() {
22+
return username;
23+
}
24+
25+
public void setUsername(String username) {
26+
this.username = username;
27+
}
28+
29+
public Set<String> getPermissions() {
30+
return permissions;
31+
}
32+
33+
public void setPermissions(Set<String> permissions) {
34+
this.permissions = permissions;
35+
}
36+
37+
public static DetailedUserDto fromEntity(User user) {
38+
DetailedUserDto detailed = new DetailedUserDto();
39+
detailed.setId(user.getId());
40+
detailed.setUsername(user.getUsername());
41+
detailed.setPermissions(user.getPermissions());
42+
43+
return detailed;
44+
}
45+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.baeldung.web;
2+
3+
import com.baeldung.service.UserService;
4+
import org.springframework.http.ResponseEntity;
5+
import org.springframework.web.bind.annotation.GetMapping;
6+
import org.springframework.web.bind.annotation.PathVariable;
7+
import org.springframework.web.bind.annotation.RequestMapping;
8+
import org.springframework.web.bind.annotation.RestController;
9+
10+
@RestController
11+
@RequestMapping("/users")
12+
public class UserController {
13+
14+
private final UserService userService;
15+
16+
public UserController(UserService userService) {
17+
this.userService = userService;
18+
}
19+
20+
@GetMapping("/{username}")
21+
public ResponseEntity<?> findOne(@PathVariable String username) {
22+
return userService.findOne(username)
23+
.map(DetailedUserDto::fromEntity)
24+
.map(ResponseEntity::ok)
25+
.orElse(ResponseEntity.notFound().build());
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.baeldung.osiv;
2+
3+
import com.baeldung.model.User;
4+
import com.baeldung.repository.UserRepository;
5+
import org.junit.jupiter.api.AfterEach;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
10+
import org.springframework.boot.test.context.SpringBootTest;
11+
import org.springframework.test.context.ActiveProfiles;
12+
import org.springframework.test.web.servlet.MockMvc;
13+
14+
import java.util.Arrays;
15+
import java.util.HashSet;
16+
17+
import static org.hamcrest.Matchers.containsInAnyOrder;
18+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
19+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
20+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
21+
22+
@SpringBootTest
23+
@AutoConfigureMockMvc
24+
@ActiveProfiles("test")
25+
class UserControllerIntegrationTest {
26+
27+
@Autowired
28+
private UserRepository userRepository;
29+
30+
@Autowired
31+
private MockMvc mockMvc;
32+
33+
@BeforeEach
34+
void setUp() {
35+
User user = new User();
36+
user.setUsername("root");
37+
user.setPermissions(new HashSet<>(Arrays.asList("PERM_READ", "PERM_WRITE")));
38+
39+
userRepository.save(user);
40+
}
41+
42+
@Test
43+
void givenTheUserExists_WhenOsivIsEnabled_ThenLazyInitWorkEverywhere() throws Exception {
44+
mockMvc.perform(get("/users/root"))
45+
.andExpect(status().isOk())
46+
.andExpect(jsonPath("$.username").value("root"))
47+
.andExpect(jsonPath("$.permissions", containsInAnyOrder("PERM_READ", "PERM_WRITE")));
48+
}
49+
50+
@AfterEach
51+
void flushDb() {
52+
userRepository.deleteAll();
53+
}
54+
}

persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/tx/ManualTransactionIntegrationTest.java

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.baeldung.tx;
22

3+
import com.baeldung.model.Payment;
34
import org.junit.jupiter.api.AfterEach;
45
import org.junit.jupiter.api.BeforeEach;
56
import org.junit.jupiter.api.Test;
67
import org.springframework.beans.factory.annotation.Autowired;
7-
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
88
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
99
import org.springframework.test.context.ActiveProfiles;
1010
import org.springframework.transaction.PlatformTransactionManager;
@@ -14,27 +14,17 @@
1414
import org.springframework.transaction.support.DefaultTransactionDefinition;
1515
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
1616
import org.springframework.transaction.support.TransactionTemplate;
17-
import org.testcontainers.containers.PostgreSQLContainer;
18-
import org.testcontainers.junit.jupiter.Container;
19-
import org.testcontainers.junit.jupiter.Testcontainers;
2017

2118
import javax.persistence.EntityManager;
2219

23-
import static java.util.Collections.singletonList;
2420
import static org.assertj.core.api.Assertions.assertThat;
25-
import static org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace.NONE;
2621
import static org.springframework.transaction.annotation.Propagation.NOT_SUPPORTED;
2722

2823
@DataJpaTest
29-
@Testcontainers
3024
@ActiveProfiles("test")
31-
@AutoConfigureTestDatabase(replace = NONE)
3225
@Transactional(propagation = NOT_SUPPORTED)
3326
class ManualTransactionIntegrationTest {
3427

35-
@Container
36-
private static PostgreSQLContainer<?> pg = initPostgres();
37-
3828
@Autowired
3929
private PlatformTransactionManager transactionManager;
4030

@@ -159,13 +149,4 @@ void givenAPayment_WhenUsingTxManager_ThenShouldCommit() {
159149
.getResultList()).hasSize(1);
160150
}
161151

162-
private static PostgreSQLContainer<?> initPostgres() {
163-
PostgreSQLContainer<?> pg = new PostgreSQLContainer<>("postgres:11.1")
164-
.withDatabaseName("baeldung")
165-
.withUsername("test")
166-
.withPassword("test");
167-
pg.setPortBindings(singletonList("54320:5432"));
168-
169-
return pg;
170-
}
171152
}

0 commit comments

Comments
 (0)