
우선, EntityManagerFactory를 자주 사용해서, 별도에 클래스로 작성해준다.
public class EMF {
private static EntityManagerFactory emf;
public static void init() {
emf = Persistence.createEntityManagerFactory("jpabegin");
}
public static EntityManager createEntityManager() {
return emf.createEntityManager();
}
public static void close() {
emf.close();
}
}
EntityManager가 제공하는 메서드
- persist()
- find()
- remove()
- merge()
public class NewUserService {
public void saveNewUser(User user) {
EntityManager em = EMF.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin(); // 트랜잭션 시작
em.persist(user); // 저장
tx.commit(); // 커밋
} catch(Exception ex) {
tx.rollback();
throw ex;
} finally {
em.close();
}
}
}
저번 시간에 배웠던 내용과 다르지 않다.
public class GetUserService {
public User getUser(String email) {
EntityManager em = EMF.createEntityManager();
try {
User user = em.find(User.class, email);
if (user == null) {
throw new NoUserException();
}
return user;
} finally {
em.close();
}
}
}
find(Class entityClass, Object PrimaryKey)
- 첫번째 파라미터 : 객체를 받아올 타입
- 두번째 파라미터 : 식별자
[ 주의 사항 ]
null 여부 판단 필요.
엔티티 타입, ID 타입이 맞아야 함.
public class ChangeNameService {
public void changeName(String email, String newName) {
EntityManager em = EMF.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
User user = em.find(User.class, email);
if (user == null) {
throw new NoUserException();
}
user.changeName(newName);
tx.commit();
} catch(Exception ex) {
tx.rollback();
throw ex;
} finally {
em.close();
}
}
}
public class RemoveUserService {
public void removeUser(String email) {
EntityManager em = EMF.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
User user = em.find(User.class, email);
if (user == null) {
throw new NoUserException();
}
em.remove(user);
tx.commit();
} catch(Exception ex) {
tx.rollback();
throw ex;
} finally {
em.close();
}
}
}
[ 주의 사항 ]
- find()로 불러온 객체를 remove 해야 에러가 안생김!
- 삭제 대상이 존재하지 않아도 익셉션 발생!