Entity Manager
를 사용해야 함// Entity를 생성!
Member minsook = new Member();
member.setId("abcd1234");
member.setUsername("민숙");
// EntityManager를 생성해줄 EntityManagerFactory를 만들어야합니다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa심화주차");
// Entity를 관리해줄 EntityManager를 EntityManagerFactory에서 생성!
EntityManager em = emf.createEntityManager();
// 엔티티를 영속화(저장)
em.persist(minsook);
// 엔티티를 찾기
em.find(Member.class, 100L);
Entity
를 영구 저장 하는 환경 이라는 뜻DB
에서 꺼내온 데이터 객체를 보관하는 가상의 DB
같은 역할Entity Manager
를 통해 엔티티를 조회하거나 저장할때 엔티티를 보관 및 관리+ 추가
- 서비스별로 하나의
EntityManager Factory
가 존재하며Entity Manager Factory
에서 디비에 접근하는 트랜잭션이 생길 때 마다 쓰레드 별로EntityManager
를 생성하여 영속성 컨텍스트에 접근한다!!- 영속성 컨텍스트는
EntityManager
를 생성할 때 만들어지며EntityManager
를 통해 영속성 컨텍스트에 접근하고 관리한다.- 다음 코드로 Entity를 영속성 컨텍스트에 저장할 수 있다.
->entityManager.persist(entity);
- Spring에서는
EntityManager
를 주입하여 사용하면 같은 트렌잭션의 범위에 있는 EntityManager는 같은 영속성 컨텍스트에 접근한다.
1. 비영속(new/transient)
2. 영속(managed)
3. 준영속(detached)
4. 삭제(removed)
// 1. 비영속, 엔티티를 생성
Member minsook = new Member();
// 2. 영속, 엔티티 매니저를 통해 영속성 컨텍스트에 엔티티를 저장
// 클래스내에 Autowired로 EntityManager 추가
@Autowired
private EntityManager em;
Member minsook = new Member(); // 객체만 생성한 비영속 상태
em.persist(minsook); // 객체를 저장한 영속상태
// 3. 준영속, 엔티티를 영속성 컨택스트에서 분리해 준영속 상태 만들기
em.detach(minsook);
// 영속성 컨텍스트를 비우면 엔티티들은 준영속 상태가 됨
em.clear();
// 영속성 컨택스트를 종료해도 엔티티들은 준영속 상태가 됨
em.close();
// 준영속 -> 영속, 엔티티를 merge하면 다시 영속 상태가 됨
em.merge(minsook);
// 4. 삭제, 엔티티를 영속성 컨텍스트와 DB에서 삭제
em.remove(minsook)
@ManyToOne
(N: 1)
@JoinColumn(name="food_id")
@Getter
@Entity
@NoArgsConstructor
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String memberName;
@OneToMany(mappedBy = "member", fetch = FetchType.EAGER)
private List<Orders> orders = new ArrayList<>();
public Member(String memberName) {
this.memberName = memberName;
}
}
@Getter
@Entity
@NoArgsConstructor
public class Orders {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "food_id")
private Food food; // 한 음식은 여러 주문에 포함 가능
@ManyToOne
@JoinColumn(name = "member_id")
private Member member; // 한 멤버는 여러 주문 가능+
public Orders(Food food, Member member) {
this.food = food;
this.member = member;
}
}
@Getter
@Entity
@NoArgsConstructor
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String foodName;
@Column(nullable = false)
private int price;
@OneToMany(mappedBy = "food",fetch = FetchType.EAGER)
private List<Orders> orders = new ArrayList<>();
public Food(String foodName, int price) {
this.foodName = foodName;
this.price = price;
}
}
Member Orders Food
1 : N
N : 1
@OneToMany - orders @ ManyToOne - member
@ ManyToOne - food @ OneToMany - orders
@OneToMany
영속성 컨텍스트
스파르타코딩클럽 - Spring 숙련
https://velog.io/@neptunes032/JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%9E%80