inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 ORM 표준 JPA 프로그래밍 - 기본편

기존 DB의 테이블과 jpa로 만들어진 테이블과 관계 맺기

1892

yonglimlee

작성한 질문수 5

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
이미 실무에서 사용중인 데이터베이스가 있습니다. 이 DB 안에는 기 생성된 테이블들이 있구요.

JPA를 활용해 기존 DB에 접근해 필요한 테이블들을 추가하고 엔티티 매핑하는 작업들은 잘 되었는데요.

문제는 기존 DB의 "User" 테이블과 제가 새로 만든 테이블의 관계를 맺어주는 것이 가능한건가 해서요.


[tb_user] <- 기존에 존재하던 테이블 (아래는 스키마)

user_id : String : "S00001"

name : String : "홍길동"

age : int : 30


[tb_user_history] <- 새로 등록한 테이블

@Entity
@Data
@Table(name="tb_user_history")
public class UserHistory {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name="user_history_id")
   private Long id;
   
    //연관 관계를 맺어주는게 가능한가요??????
   private String user_id;
}

제 프로그램상에서 생성하고 관리하는 테이블이라면 @ManyToOne, @JoinColumn을 이용해서 조인과 외래키 생성 작업을 해줄수있는데

지금과 같은 경우에서는 어떤식으로 가능할까요?

java JPA

답변 1

0

David

안녕하세요. yonglimlee님, 공식 서포터즈 David입니다.

User 엔티티를 만드시고, 기존 테이블, 컬럼명을 동일하게 매핑하시면 될 것 같습니다.

id의 경우 시퀀스가 아니라서 별도의 generator를 만드셔야겠지만요.

그런 다음 UserHistory와 연관관계를 맺으면 됩니다.

감사합니다.

0

yonglimlee

답변 감사드려요!

그런데 지금 말씀하신것처럼 클래스 생성했는데, 새로 테이블을 만들려고 시도를 하나 봅니다.

아래처럼 클래스를 만들고 실행하니

"데이터베이스에 'tb_user'(이)라는 개체가 이미 있습니다." 라는 에러가 뜨고 실행이 안되네요.

뭔가 추가로 어노테이션이 필요할까요??

@Entity
@Data
@Table(name="TB_USER")
public class USER {
    @Id
    @Column(name="USER_ID")
    private String id;
	..
}

0

David

혹시 ddl-auto 옵션이 create이신가요? none으로 변경하시고 다시 시도해보시겠어요?

0

yonglimlee

[개발환경]
ms-sql 11.2.1.jre8

[jpa 설정]
spring.jpa.show-sql=true
spring.jpa.format-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.use-new-id-generator-mappings=false
## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.SQLServerDialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update


ddl-auto를 none으로 변경하면 제가 생성하길 원하는 다른 테이블도 만들어지지 않기 때문에 
update로 했구요. 
테이블이 계속 있다고 뜨던 오류는 spring.jpa.hibernate.use-new-id-generator-mappings=false 
을 true에서 false로 변환하니 더이상 뜨지는 않습니다.

추가 질문드립니다.

@Entity 
@Data
@Table(name="tb_user")  ==> 기존에 존재하는 테이블
public class User {
    @Id
    @Column(name="user_id")
    private Long id;

    private String name;
    private int age;
}

@Entity
@Data
@Table(name="tb_user_history")  ==> 신규 테이블
public class UserHistory {
    @Id
    @GeneratedValue
    @Column(name="user_history_id")
    private Long id;

    @ManyToOne
    @JoinColumn(name="user_id")
    private User user;
}

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 열 'tb_user.user_id'의 길이 또는 배율이 외래 키 'FKrde89thx2r5wyw87hk2fqud5n'에 있는 참조 열 'tb_user_history.user_id'의 길이 또는 배율과 다릅니다. 외래 키 관계에 참여하는 열은 같은 길이와 배율로 정의되어야 합니다.
위와 같은 에러가 생기는데  @ManyToOne, @JoinColumn 모두 정상적으로 작성한것 같은데 외래키 관련해서 계속 에러가 뜨더라구요.

실제로 tb_user_history 테이블 생성된것을 확인해보면 컬럼들과 기본키는 설정이 되었는데 외래키는
설정이 되지 않았음을 확인할 수 있습니다. 

image

혹시 확인해볼만한것이 있을까요?

0

David

제일 마지막 이미지에 user_id 컬럼이 외래키로 보이는데, 외래키가 설정이 되지 않았다는 말씀은 어떤 걸 말씀하시는걸까요?

0

yonglimlee

위 오류 메시지처럼 오류는 나지만 테이블은 생성이 됩니다.

다만 user_id는 외래키로 설정했는데도 불구하고, 오류 때문인지 외래키로 설정이 안되는것 같아보이고 이는 제가 사용하는 DBeaver를 통해서 확인했습니다.

아래는 기존 테이블인 User Entity가 아니라, 새로 생성한 User2라는 Entity입니다.

package com.rttq.kogas.app.model.entity.taxonomy;

import lombok.Data;

import javax.persistence.*;

@Entity
@Data
@Table(name="tb_user2")
public class User2 {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="user2_id")
    private long id;

    @Column(columnDefinition = "char(4)")
    private Character text;
}

이를 이용해서 tb_user_history에 외래키를 사용하게 되면

@Entity
@Data
@Table(name="tb_user_history")
public class UserHistory {
    @Id
    @GeneratedValue
    @Column(name="user_history_id")
    private Long id;

    @ManyToOne
    @JoinColumn(name="user2_id")
    private User2 user;
}

image아래처럼 외래키가 설정되어있음을 확인할 수 있습니다.

image

0

David

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 열 'tb_user.user_id'의 길이 또는 배율이 외래 키 'FKrde89thx2r5wyw87hk2fqud5n'에 있는 참조 열 'tb_user_history.user_id'의 길이 또는 배율과 다릅니다. 외래 키 관계에 참여하는 열은 같은 길이와 배율로 정의되어야 합니다.


tb_user 테이블의 user_id의 길이와 tb_user_history 테이블의 user_id의 길이가 동일하신가요?

만약 차이가 없는데도 오류가 발생한다면 생성되지 않는 외래키를 제약조건을 직접 추가하는 것도 하나의 방법인 것 같습니다.

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

58

2

inheritance startegy 선택시 고려사항

0

42

1

Entity 동등성 비교

0

47

1

실무 조언 관련 질문입니다.

0

68

1

H2데이터베이스 파일 생성

0

78

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

70

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

63

1

JPQL 메소드와 락

0

63

1

Delivery @OneToOne

0

71

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

104

2

UnsupportedOperationException 발생

0

97

3

H2 Database 연결이 안됩니다.

0

103

2

연관관계 매핑 질문드립니다.

0

95

2

h2데이터베이스 실행오류

0

116

2

persistence.xml

0

121

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

90

1

영속성 컨텍스트

0

77

1

JPA 프록시

0

107

1

Native Query와 MyBatis

0

83

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

97

1

임베디드 타입 예시 코드 관련 질문

0

126

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

103

3

인텔리제이 패키지 커서 단축키 질문

0

113

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

156

1