• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

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

22.10.27 13:42 작성 조회수 1.34k

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을 이용해서 조인과 외래키 생성 작업을 해줄수있는데

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

답변 1

답변을 작성해보세요.

0

David님의 프로필

David

2022.10.27

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

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

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

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

감사합니다.

yonglimlee님의 프로필

yonglimlee

질문자

2022.10.28

답변 감사드려요!

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

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

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

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

@Entity
@Data
@Table(name="TB_USER")
public class USER {
    @Id
    @Column(name="USER_ID")
    private String id;
	..
}
David님의 프로필

David

2022.10.28

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

yonglimlee님의 프로필

yonglimlee

질문자

2022.11.14

[개발환경]
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

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

David님의 프로필

David

2022.11.14

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

yonglimlee님의 프로필

yonglimlee

질문자

2022.11.15

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

다만 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

David님의 프로필

David

2022.11.15

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의 길이가 동일하신가요?

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