스프링/게시판 프로젝트

스프링부트 복합키 연습

까마귀! 2024. 4. 5. 13:43

jpa에서 복합키를 다루는 어노테이션은 @Embeddble, @idclass다.

이중 @Embeddble로 연습했다.

 

 

pk id를 복합키로 설정했다.

UserPk.java
@Embeddable
@Data
public class UserPk implements Serializable {

    private int id;
}

 

 

 

UserPk의 id는 User테이블의 아이디다

User.java
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @EmbeddedId
    private UserPk id;

    @Column(nullable = false)
    private String person_id;

    @Column(nullable = false)
    private String passwd;

    @Column(nullable = false)
    private LocalDateTime created_at;

    @Column(nullable = false)
    private LocalDateTime last_id_changed;

    @Column(nullable = false)
    private LocalDateTime last_passwd_changed;


}

 

 

 

UserInfo에서 User의 아이디와 조인하기

UserInfo.java
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Embeddable
public class UserInfo implements Serializable {

    @EmbeddedId
    private UserPk id;

    @MapsId
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
    private User user;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private Role role;

    @Column(nullable = false)
    private String user_name;

    @Column(nullable = false)
    private int old;

    @Column(nullable = false)
    private String phone_num;

 

 

 

복합키는 @GeneratedValue가 되지 않는다. id가 자동증가 할 수 있게끔 UserPkRepository를 생성했는데 그 결과...

 

안된다 ㅡㅡ

 

 

 

그래서 id를 다루는 테이블을 따로 만들었다.

AutoPk.java
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AutoPk {

    @Id
    private int id;

}

 

 

 

AutoPkRepository
public interface AutoPkRepository extends JpaRepository<AutoPk, Integer> {

    @Query("select id from AutoPk  order by id desc limit 1")
    int findMaxId();

가장 큰 숫자 하나를 불러오는 쿼리문을 만들었다.

 

 

문제는 또 안된다...

이렇게 나옴

 

 

왜 안되는걸까 이렇게 저렇게 다뤄봤는데 그 결과

@Query에 limit있으면 안되더라

jpa 은근 까다로운듯 하다.

 

코드를 바꿨다

public interface AutoPkRepository extends JpaRepository<AutoPk, Integer> {

    @Query("select max(id) from AutoPk")
    Optional<Integer> findMaxId();

}

이렇게 쿼리문을 바꾸니까 정상적으로 실행된걸 확인할 수 있었다.

 

 

서비스에서 1씩 증가하도록 설정해서 실행하니 결과가 잘 나왔다

 

 

 

 

user와 userinfo 모두 정상적으로 잘 나왔다

'스프링 > 게시판 프로젝트' 카테고리의 다른 글

스프링부트 페이징처리 구현 연습  (1) 2024.04.05
파일 생성 연습  (2) 2024.03.23