Jpa 환경에서 Entity로 테이블을 만들 때, 클래스 상단에 @Table 어노테이션과 함께
user, order 등으로 테이블 명을 만들면 안되는지 궁금해졌다.
@Table(name = "user"), @Table(name = "order")
어노테이션을 사용해서 테이블 명을 설정해 주고자 하니, 오류가 발생했다는 글 들을 찾을 수 있었다.
@Table 어노테이션을 사용하지 않고, 놔두면 클래스 명 그대로 생성되게 되는데, 예를 들어 클래스 명이 User, Order인 경우에도 오류가 발생할 수 있다.
오류가 발생하는 이유는, 예약어이기 때문이다.
Order의 경우, SQL에서 사용하는 Order By에 사용되는 키워드이다.
User의 경우도 마찬가지로 SQL 에서 사용하는 예약어에 해당하기 때문에 사용할 수 없다.
예약어를 테이블 명으로 사용하면 오류가 난다는 점을 알게 되었다.
SQL에서 사용하는 모든 예약어의 내용을 알 수는 없지만,
흔히 사용하는 user와 order는 주의하면 좋을 것 같다!
@Table을 이용해서 table 명을 지정해 줄 때, 예약어를 사용하지 않도록 아래의 사이트에서 예약어를 검색해 보고 사용해야 겠다!
출처: https://dev.mysql.com/doc/refman/8.0/en/keywords.html
출처: https://bbubbush.tistory.com/55
오류가 발생했다 ...
Entity 클래스를 두 개 만들고, 관계 설정을 1:N 으로 설정한 다음 잘 되는지 실행해보았는데..
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name
'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm
/jpa/HibernateJpaConfiguration.class]: Collection 'com.example.post.entity.User.postList'
is 'mappedBy' a property named
'post_id' which does not exist in the target entity 'com.example.post.entity.Post'
상큼한 오류가 발생했다.
혹시 Entity 간의 관계를 설정해두고, 에너테이션을 잘못 사용했나 싶어 다시 읽어보았다.
나는 Post라는 엔티티와 User라는 엔티티를 N:1 관계로 두고, Post 쪽에서도 User를 조회할 수 있고, User쪽에서도 Post를 조회할 수 있는 양방향으로 설정해두었다.
따라서 N인 Post에서는 @ManyToOne 과 @JoinColumn 에너테이션이 필요하고,
1인 User에서는 @OneToMany와 (mappedBy="")속성이 필요하다.
어떤 것을 잘못했을까 ..?
mappedBy = "" 속성을 잘못주었다 ..
mappedBy는 N:1의 관계에서 1쪽에 있는 엔티티에서 사용하는 속성으로,
N쪽에 있는 (상대 엔티티에 있는) 1쪽의 엔티티 타입의 필드명을 주어야 하는데,
1쪽의 엔티티 타입의 pk 값을 주었다 ..!
그래서 자꾸 "post_id"가 post entity에 없다 .. 라는 오류가 발생한 것이었다 ...
어떤 상황에서 어떤 에너테이션을 사용하는지는 익숙해졌으나,
속성 값을 줄 때 주의해야 겠다.
@OneToMany 에너테이션을 사용할 때가 제일 헷갈리니 잘 보고 작성해야겠다 !