작성
·
1.8K
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
[개발환경]
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 테이블 생성된것을 확인해보면 컬럼들과 기본키는 설정이 되었는데 외래키는
설정이 되지 않았음을 확인할 수 있습니다.
혹시 확인해볼만한것이 있을까요?
위 오류 메시지처럼 오류는 나지만 테이블은 생성이 됩니다.
다만 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;
}
아래처럼 외래키가 설정되어있음을 확인할 수 있습니다.
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의 길이가 동일하신가요?
만약 차이가 없는데도 오류가 발생한다면 생성되지 않는 외래키를 제약조건을 직접 추가하는 것도 하나의 방법인 것 같습니다.
답변 감사드려요!
그런데 지금 말씀하신것처럼 클래스 생성했는데, 새로 테이블을 만들려고 시도를 하나 봅니다.
아래처럼 클래스를 만들고 실행하니
"데이터베이스에 'tb_user'(이)라는 개체가 이미 있습니다." 라는 에러가 뜨고 실행이 안되네요.
뭔가 추가로 어노테이션이 필요할까요??