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 |