Skip to content

Commit 56a6ab3

Browse files
committed
Add lazy load
1 parent 8f38c27 commit 56a6ab3

File tree

16 files changed

+103
-63
lines changed

16 files changed

+103
-63
lines changed

src/main/java/com/github/throyer/common/springboot/api/controllers/UsersController.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.github.throyer.common.springboot.api.domain.services.user.dto.CreateUser;
1111
import com.github.throyer.common.springboot.api.domain.services.user.dto.SearchUser;
1212
import com.github.throyer.common.springboot.api.domain.services.user.dto.UpdateUser;
13+
import com.github.throyer.common.springboot.api.domain.services.user.dto.UserDetails;
1314

1415
import org.springframework.beans.factory.annotation.Autowired;
1516
import org.springframework.data.domain.Sort;
@@ -48,25 +49,25 @@ public class UsersController {
4849

4950
@GetMapping
5051
@PreAuthorize("hasAnyAuthority('ADM')")
51-
public ResponseEntity<Page<User>> index(Pagination pagination, Sort sort, SearchUser search) {
52+
public ResponseEntity<Page<UserDetails>> index(Pagination pagination, Sort sort, SearchUser search) {
5253
return findService.find(pagination, sort, search);
5354
}
5455

5556
@GetMapping("/{id}")
5657
@PreAuthorize("hasAnyAuthority('ADM', 'USER')")
57-
public ResponseEntity<User> show(@PathVariable Long id) {
58+
public ResponseEntity<UserDetails> show(@PathVariable Long id) {
5859
return findService.find(id);
5960
}
6061

6162
@ResponseStatus(HttpStatus.CREATED)
6263
@PostMapping
63-
public ResponseEntity<User> save(@Validated @RequestBody CreateUser body) {
64+
public ResponseEntity<UserDetails> save(@Validated @RequestBody CreateUser body) {
6465
return createService.create(body);
6566
}
6667

6768
@PutMapping("/{id}")
6869
@PreAuthorize("hasAnyAuthority('ADM', 'USER')")
69-
public ResponseEntity<User> update(
70+
public ResponseEntity<UserDetails> update(
7071
@PathVariable Long id,
7172
@RequestBody @Validated UpdateUser body
7273
) {

src/main/java/com/github/throyer/common/springboot/api/domain/models/entity/BasicEntity.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@
1414
import javax.persistence.PreUpdate;
1515

1616
import com.fasterxml.jackson.annotation.JsonIgnore;
17+
import com.github.throyer.common.springboot.api.domain.models.shared.Entity;
1718

1819
@MappedSuperclass
19-
public abstract class BasicEntity {
20+
public abstract class BasicEntity implements Entity {
2021

2122
public static final String NON_DELETED_CLAUSE = "deleted_at IS NULL";
2223

@@ -29,6 +30,7 @@ public abstract class BasicEntity {
2930

3031
public static final String SET_DELETED_SQL = SET_ALL_DELETED_SQL + "WHERE id = ?1";
3132

33+
@Override
3234
public abstract Long getId();
3335

3436
@JsonIgnore

src/main/java/com/github/throyer/common/springboot/api/domain/models/entity/Recovery.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
import javax.persistence.Id;
1212
import javax.persistence.JoinColumn;
1313
import javax.persistence.ManyToOne;
14+
import javax.persistence.Table;
1415

15-
@Entity(name = "recovery")
16+
@Entity
17+
@Table(name = "recovery")
1618
public class Recovery {
1719
@Id
1820
@GeneratedValue(strategy = GenerationType.IDENTITY)

src/main/java/com/github/throyer/common/springboot/api/domain/models/entity/RefreshToken.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
import javax.persistence.Id;
1111
import javax.persistence.JoinColumn;
1212
import javax.persistence.ManyToOne;
13+
import javax.persistence.Table;
1314

14-
@Entity(name = "refresh_token")
15+
@Entity
16+
@Table(name = "refresh_token")
1517
public class RefreshToken {
1618
@Id
1719
@GeneratedValue(strategy = GenerationType.IDENTITY)

src/main/java/com/github/throyer/common/springboot/api/domain/models/entity/Role.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77
import javax.persistence.GeneratedValue;
88
import javax.persistence.GenerationType;
99
import javax.persistence.Id;
10+
import javax.persistence.Table;
1011

1112
import com.fasterxml.jackson.annotation.JsonIgnore;
1213

1314
import org.hibernate.annotations.Where;
1415
import org.springframework.security.core.GrantedAuthority;
1516

16-
@Entity(name = "role")
17+
@Entity
18+
@Table(name = "role")
1719
@Where(clause = BasicEntity.NON_DELETED_CLAUSE)
1820
public class Role extends BasicEntity implements GrantedAuthority {
1921

src/main/java/com/github/throyer/common/springboot/api/domain/models/entity/User.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
import javax.persistence.CascadeType;
99
import javax.persistence.Column;
1010
import javax.persistence.Entity;
11+
import javax.persistence.FetchType;
1112
import javax.persistence.GeneratedValue;
1213
import javax.persistence.GenerationType;
1314
import javax.persistence.Id;
1415
import javax.persistence.JoinColumn;
1516
import javax.persistence.JoinTable;
1617
import javax.persistence.ManyToMany;
1718
import javax.persistence.PrePersist;
19+
import javax.persistence.Table;
1820

1921
import com.fasterxml.jackson.annotation.JsonIgnore;
2022
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -27,7 +29,8 @@
2729
import org.hibernate.annotations.Where;
2830
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
2931

30-
@Entity(name = "user")
32+
@Entity
33+
@Table(name = "user")
3134
@Where(clause = BasicEntity.NON_DELETED_CLAUSE)
3235
public class User extends BasicEntity implements Serializable, HasEmail {
3336

@@ -72,7 +75,7 @@ public class User extends BasicEntity implements Serializable, HasEmail {
7275
private String password;
7376

7477
@SortableProperty(name = "role", column = "roles_name")
75-
@ManyToMany(cascade = CascadeType.DETACH)
78+
@ManyToMany(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
7679
@JoinTable(name = "user_role",
7780
joinColumns = {
7881
@JoinColumn(name = "user_id")},
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.github.throyer.common.springboot.api.domain.models.shared;
2+
3+
public interface Entity {
4+
Long getId();
5+
}

src/main/java/com/github/throyer/common/springboot/api/domain/repositories/RefreshTokenRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public interface RefreshTokenRepository extends JpaRepository<RefreshToken, Long
1818
@Modifying
1919
@Query("""
2020
UPDATE
21-
refresh_token
21+
RefreshToken
2222
SET
2323
available = 0
2424
WHERE

src/main/java/com/github/throyer/common/springboot/api/domain/repositories/UserRepository.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,12 @@ default void deleteAll(Iterable<? extends User> entities) {
3838

3939
public Optional<User> findOptionalByIdAndDeletedAtIsNull(Long id);
4040

41+
@Query("""
42+
SELECT user FROM User user
43+
JOIN FETCH user.roles
44+
WHERE user.id = ?1
45+
""")
46+
public Optional<User> findOptionalByIdAndDeletedAtIsNullFetchRoles(Long id);
47+
4148
public Optional<User> findOptionalByEmail(String email);
4249
}

src/main/java/com/github/throyer/common/springboot/api/domain/services/security/dto/TokenResponse.java

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.github.throyer.common.springboot.api.domain.services.security.dto;
22

33
import java.time.LocalDateTime;
4-
import java.util.List;
54

65
import com.fasterxml.jackson.annotation.JsonFormat;
76
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
87
import com.fasterxml.jackson.annotation.JsonProperty;
98
import com.github.throyer.common.springboot.api.domain.models.entity.RefreshToken;
109
import com.github.throyer.common.springboot.api.domain.models.entity.User;
10+
import com.github.throyer.common.springboot.api.domain.services.user.dto.UserDetails;
1111

1212
public class TokenResponse {
1313
private final UserDetails user;
@@ -52,37 +52,4 @@ public LocalDateTime getExpiresIn() {
5252
public String getTokenType() {
5353
return type;
5454
}
55-
56-
public class UserDetails {
57-
private final Long id;
58-
private final String name;
59-
private final String email;
60-
private final List<String> roles;
61-
62-
public UserDetails(User user) {
63-
this.id = user.getId();
64-
this.name = user.getName();
65-
this.email = user.getEmail();
66-
this.roles = user.getRoles()
67-
.stream()
68-
.map(role -> role.getAuthority())
69-
.toList();
70-
}
71-
72-
public Long getId() {
73-
return id;
74-
}
75-
76-
public String getName() {
77-
return name;
78-
}
79-
80-
public String getEmail() {
81-
return email;
82-
}
83-
84-
public List<String> getRoles() {
85-
return roles;
86-
}
87-
}
8855
}

0 commit comments

Comments
 (0)