✔️Member 클래스
@Entity
public class Member {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "TEAM_ID")
private Long team_id;
private String username;
// Getter/Setter ...
}
✔️Team 클래스
@Entity
public class Team {
@Id
@GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
// Getter/Setter ...
}
✔️JpaMain 클래스
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member = new Member();
member.setUsername("userA");
member.setTeam_id(team.getId());
em.persist(member);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}
@Entity
public class Member {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
//////////////////////////////// 핵심 코드
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
public Team getTeam() {
return team;
}
public void setTeam(Team team) {
this.team = team;
}
//////////////////////////////////
// Getter/Setter ...
}
class A {
B b;
}
class B {
A a;
}
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("ex");
EntityManager em = emf.createEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
try {
// [1]. 연관관계의 주인이 아닌 곳에서 값을 입력하는 경우 발생할 수 있는 경우
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member memberA = new Member();
memberA.setName("memberA");
team.getMembers().add(memberA);
em.persist(memberA);
Member memberB = new Member();
memberB.setName("memberB");
team.getMembers().add(memberB);
em.persist(memberB);
et.commit();
} catch (Exception e) {
et.rollback();
} finally {
em.close();
}
emf.close();
}
}
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("ex");
EntityManager em = emf.createEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
try {
Team team = new Team();
team.setName("TeamA");
em.persist(team);
/*
// [1]. 연관관계의 주인이 아닌 곳에서 값을 입력하는 경우 발생할 수 있는 경우
Member memberA = new Member();
memberA.setName("memberA");
team.getMembers().add(memberA);
em.persist(memberA);
Member memberB = new Member();
memberB.setName("memberB");
team.getMembers().add(memberB);
em.persist(memberB);
*/
// [2]. 연관관계의 주인에서 값을 입력
Member memberA = new Member();
memberA.setName("memberA");
memberA.setTeam(team);
em.persist(memberA);
Member memberB = new Member();
memberB.setName("memberB");
memberB.setTeam(team);
em.persist(memberB);
et.commit();
} catch (Exception e) {
et.rollback();
} finally {
em.close();
}
emf.close();
}
}
Team
클래스에 있는 컬렉션을 Getter
로 가져와서 add()
메서드를 호출하여 추가하는 것으로 볼 수 있고 정상적으로 동작하는 것처럼 보여지나 결과는 정상적으로 동작하지 않는 것을 볼 수 있다.Member
클래스 안에 있는 참조 필드인 Team
이기 때문에 연관관계의 주인이 아닌 Team
클래스에서 Getter
로 가져와서 add()
메서드로 호출한다한들 정상적으로 저장이 되지 않는 것이다. 위의 코드를 바로 잡으려면 아래와 같이 수정해야 한다.by 연관관계 편의 메서드
✔️Member 클래스
@Entity
@Table(name = "MEMBERS")
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
private String city;
private String street;
private String zipcode;
/////////////////////////////////////////
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
/////////////////////////////////////////
}
✔️Order 클래스
@Entity
@Table(name = "ORDERS")
public class Order {
@Id @GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
/////////////////////////////////////////
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems = new ArrayList<>();
/////////////////////////////////////////
// 연관관계 편의 메서드
public void addOrderItem(OrderItem orderItem) {
orderItems.add(orderItem);
orderItem.setOrder(this);
}
}
✔️OrderItem 클래스
@Entity
public class OrderItem {
@Id @GeneratedValue
private Long id;
/////////////////////////////////////////
@ManyToOne
@JoinColumn(name = "ORDER_ID")
private Order order;
@ManyToOne
@JoinColumn(name = "ITEM_ID")
/////////////////////////////////////////
private Item item;
private int orderPrice;
private int count;
public void setOrder(Order order) {
this.order = order;
}
}
✔️Item 클래스
@Entity
public class Item {
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
private int stockQuantity;
}