복합키 one to one 매핑

Tae hyun·2023년 2월 17일
0
post-thumbnail

리뷰엔티티의 order_num이 orderDetail엔티티의 복합키(order_num+prod_num)을 one to one으로 참조해야했다.

처음에는 아래와 같이 Review엔티티에는

@OneToOne
@JoinColumns({ @JoinColumn(name = "order_num", nullable = false),
@JoinColumn(name = "prod_num", nullable = false) })
private OrderDetail orderDetail;
을 해주고

package com.myomi.review.entity;

import java.io.Serializable;
import java.time.LocalDateTime;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.myomi.order.entity.OrderDetail;
//import com.myomi.order.entity.OrderDetail;
//import com.myomi.product.entity.Product;
//import com.myomi.product.entity.Product;
import com.myomi.user.entity.User;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@DynamicInsert
@DynamicUpdate
@Entity
@Table(name = "review")
//@SequenceGenerator(
//		name =
//		"SEQ_REVIEW", // 사용할 sequence 이름
//		sequenceName =
//		"SEQ_REVIEW", // 실제 데이터베이스 sequence 이름
//		initialValue = 1, allocationSize = 1 )
public class Review implements Serializable {
	@Id
	@Column(name = "num")
//@GeneratedValue(
//		strategy = GenerationType.SEQUENCE,
//		generator=
//		"SEQ_REVIEW")
	private Long rNum;
	
//	@OneToOne(mappedBy = "review")
//	private BestReview bestReview;
	
	@OneToOne
////@JoinColumn(name="prod_num",nullable=false)
////@JoinColumn(name="order_num",nullable=false)
	@JoinColumns({ @JoinColumn(name = "order_num", nullable = false),
			@JoinColumn(name = "prod_num", nullable = false) })
	private OrderDetail orderDetail;
	
	@ManyToOne
	@JoinColumn(name = "user_id")
	private User user;
	
	@Column(nullable = false)
	private Long sort;
	
	@Column(nullable = false)
	private String title;
	
	@Column(nullable = false)
	private String content;
	
	@Column(name = "created_date")
	@ColumnDefault(value = "SYSDATE")
	@JsonFormat(pattern = "yy/MM/dd", timezone = "Asia/Seoul")
	private LocalDateTime createdDate;
	
	@Column(nullable = false)
	private Long stars;
}

orderDetail에는 아래와 같이 mapsId로 두개의 id를 묶어주고 OneToOne(mappedBy="orderDetail")로 양방향으로 서로 onetoone매핑을 해주었다.

그랬더니 자꾸만 review 엔티티의 prod_num이 자꾸만 product를 참조하는 오류가 발생했다.

해결방법은 orderDetail엔티티에서 onetoone을 해주는게 아니라 OrderDetailEmbedded 객체의 id 안에 있는 변수 oNum과 pNum의 컬럼명을 각각 order_num, prod_num으로 지정해줘서
review엔티티의 joincolum들이 걔네를 참조하게 만들어주면 되는거였다.


잘 참조해오는것을 볼수있다.

근데 테스트를 해보니 자꾸 이런 에러가 뜬다 ㅠㅠ 그래서 결국은 아직 미해결상태 ㅠㅠ

였으나 해당 에러는 OrderDetailEmbedded class의 자식인 orderDetail에서 만든 order_info 테이블에 아무것도 인서트되어있지 않아서 그런거였다.

profile
안녕하세요 개발하는 알파카입니다. https://github.com/oh-taehyun

0개의 댓글