티스토리 뷰
Springi Hibernate ; ;8-7 ;영속 객체 관리
;
Hibernate에서의 객체들의 상태
Transient, ; ;Persistent, ; ;Detached
Session ;인터페이스에서 제공하는 다양한 메서드로 상태 변경 가능
;
;
비영속(Transient) ;상태
new ;연산자로 객체를 생성하면 단순한 자바 객체임.
DB와 매핑되는 영속 객체가 아님.
매핑되기 위해서는 ;Persistent ;상태로 전이되어야 함.
영속화
Session ;객체의 ;save() ;메서드에 의해서 영속화
다른 영속화된 객체로부터 참조되는 경우 영속화
;
Person person = new Person();
person.setName("");
person.setAddress("서울시 강남구 역삼동");
person.setEmail("gurum@yahoo.com");
person.setAge(20);
;
영속(Persistent) ;상태
DB로부터 식별자를 가지면서 테이블의 ;Row와 매핑되어 있는 객체
영속 상태
Session의 ;save(), saveOrUpdate(), persist() ;메서드를 사용하여 저장된 경우
이미 ;persistent ;상태에 있는 객체에 의해 참조된 경우
get()이나 ;load() ;메서드등 ;hibernate ;조회 기능의 메서드를 사용하여 생성된 경우
;
Person person = new Person();
person.setName("");
person.setAddress("서울시 강남구 역삼동");
person.setEmail("gurum@yahoo.com");
person.setAge(20);
Session session = sessionFactory.getCurrentSession();
session.save(person);
;
;
영속 객체는 트랜잭션이 끝날때까지 ;DB와 동기화됨.
트랜잭션이 ;Commit ;될때 메모리의 객체의 상태정보가 ;SQL ;쿼리를 이용해 동기화됨을 의미함.
;
준영속(Detached) ;상태
Session의 ;close()가 호출되면 ;Data Source(DB)와의 연관이 사라지며 동기화되어 있지 않은 상태가 됨.
다른 원격 애플리케이션으로 객체가 직렬화되어 전송되는 경우도 해당
다시 영속 객체로 전이시키기 위해서 ; ;update() ;메서드를 사용함.
;
Hibernate API
Hibernate ;객체 | 설명 |
SessionFactory | SessionFactory는 ;Session ;객체를 생성하는 공장이다. SessionFactory는 ;JNDI, JDBC, JTA와 같은 데이터베이스 처리와 관련된 정보를 사용하여 ;Session ;객체를 생성한다. |
Session | Session ;객체는 데이터베이스 ;Connection과 연결되며, ;자바 객체의 영속성을 관리한다. |
TransactionFactory | Transaction ;객체에 대한 공장 역할을 한다. |
Transaction | 기본 ;JDBC, JTA ;또는 ;CORBA ;트랜잭션으로부터 어플리케이션을 추상화 시켜주는 역할을 한다. |
ConnectionProvider | JDBC Connection에 대한 공장 역할을 수행한다. ;기본 ;DataSource ;혹은 ;DriverManager에 의한 ;Connection ;획득으로부터 어플리케이션을 추상화 시켜준다. |
;
;
Session ;객체 얻기
SessionFactory ;사용
SessionFactory를 이용해 현재의 ;Session을 획득함.
트랜잭션이 종료되기 전까지는 동일한 ;Session을 가리킴
;
private static final SessionFactory sessionFactory;
static {
; ; ; ;String config = "config/hibernate/hibernate.cfg.xml";
try {
sessionFactory = new Configuration().configure(config).buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session getCurrentSession() {
; ; ;return sessionFactory.getCurrentSession();
}
;
Session API
ORM ;관련 설정 파일만 잘 작성되었다면 대부분의 기능은 ;Session ;인터페이스가 제공해주는 다양한 메서드로 손쉽게 해결 가능
메소드 | 비고 |
getTransaction() | 현재 ;Session에 해당하는 ;Transaction ;객체를 리턴한다. |
beginTransaction() | Transaction을 시작하면서 ;Transaction ;객체를 리턴한다. |
save(Object obj) | 매개변수로 들어온 객체를 영속화 시키고 식별자를 리턴한다. |
persist(Object obj) | 매개변수로 들어온 객체를 영속화 시키고 아무것도 리턴하지 않는다. |
get(Object obj) | 테이블로부터 데이터를 읽어오며, ;호출과 동시에 ;SELECT가 발생된다. ;검색된 결과가 없으면 ;null이 리턴된다. |
load(Object obj) | 테이블로부터 데이터를 읽어오며, ;호출과 동시에 ;SELECT가 실행되지 않는다. ;실제 객체의 값이 사용되는 시점에 쿼리가 실행된다. ;검색된 결과가 없으면 ;ObjetNotFoundException이 발생된다. |
update(Object obj) | 수정된 데이터를 테이블에 적용시킨다. |
merge(Object obj) | Detatched ;상태의 객체를 다시 영속화시킨다. |
saveOrUpdate(Object obj) | 매개변수에 해당하는 객체가 데이터베이스에 없으면 ;INSERT, ;있으면 ;UPDATE를 실행한다. |
delete(Object obj) | 테이블의 데이터를 삭제한다. |
;
;
데이터 조회(단건)
get() : ;호출과 동시에 쿼리 실행, ;검색결과가 없으면 ;null ;리턴
load() : ;호출시에 쿼리가 실행되지 않고 객체가 사용되는 시점에 실행. ;검색결과가 없으면 ;Exception ;리턴
public static void main(String[] args) ; ;throws Exception { ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ;HibernateUtil.beginTransaction();
; ;Session session = HibernateUtil.getCurrentSession();
; ;Board board = (Board) session.get(Board.class, 1);
; ;if(board == null){
; ; ; ;System.out.println("검색 결과가 없습니다.");
; ;} else {
; ; ; ;System.out.println("검색된 글 정보 ;: " + board.toString());
; ;}
; ;HibernateUtil.commitTransaction();
; ;HibernateUtil.closeSession();
}
;
데이터 입력
save() : ;데이터를 영속화시키고(저장하고) ;식별자를 리턴함.
persist() : ;식별자를 리턴하지 않음.
public static void main(String[] args) ; ;throws Exception { ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ; ; ;HibernateUtil.beginTransaction();
; ; ; ; ; ; ; ; ; ; ;Session session = HibernateUtil.getCurrentSession();
; ; ; ; ; ; ; ; ; ; ;Board board = new Board();
; ; ; ; ; ; ; ; ; ; ;board.setTitle("가입인사");
; ; ; ; ; ; ; ; ; ; ;board.setWriter("");
; ; ; ; ; ; ; ; ; ; ;board.setContent("잘 부탁드립니다.");
; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ; ; ;int boardNum = (Integer)session.save(board); ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ; ; ;System.out.println(boardNum + " ;번 게시물 저장 성공!!!");
; ; ; ; ; ; ; ; ; ; ;HibernateUtil.commitTransaction();
; ; ; ; ; ; ; ; ; ; ;HibernateUtil.closeSession();
}
;
;
데이터 수정
이미 등록되어 있는 객체를 꺼내서 데이터를 수정하고 ;update() ;메서드를 이용해 수정된 정보를 반영시킴.
public static void main(String[] args) ; ;throws Exception { ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ; ; ;HibernateUtil.beginTransaction();
; ; ; ; ; ; ; ; ; ; ;Session session = HibernateUtil.getCurrentSession();
; ; ; ; ; ; ; ; ; ; ;Board board = (Board) session.get(Board.class, 1);
; ; ; ; ; ; ; ; ; ; ;board.setTitle("수정된 제목");
; ; ; ; ; ; ; ; ; ; ;session.update(board);
; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ; ; ;System.out.println("===> " + (Board) session.get(Board.class, 1));
; ; ; ; ; ; ; ; ; ; ;HibernateUtil.commitTransaction();
; ; ; ; ; ; ; ; ; ; ;HibernateUtil.closeSession();
}
;
데이터 삭제
public static void main(String[] args) ; ;throws Exception { ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ; ; ;HibernateUtil.beginTransaction();
; ; ; ; ; ; ; ; ; ; ;Session session = HibernateUtil.getCurrentSession();
; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ; ; ;Board board = (Board) session.get(Board.class, 1);
; ; ; ; ; ; ; ; ; ; ;session.delete(board);
; ; ; ; ; ; ; ; ; ; ;HibernateUtil.commitTransaction();
; ; ; ; ; ; ; ; ; ; ;HibernateUtil.closeSession();
}
;
;
;
;
;
;
;
;
;
;
테이블에 존재하지 않는 객체에 대해 ;update()를 호출하면 ;Exception
이런 경우 ;saveOrUpdate() ;메서드 이용
;
;
;
;
'It' 카테고리의 다른 글
자바 생성자 (0) | 2023.01.23 |
---|---|
불의 발견과 이용 (0) | 2023.01.22 |
디지털 시스템의 장점 (0) | 2023.01.22 |
형용사절(Relative Clause-형용사류)과 명사(보어)절(Noun Complement Clause-명사류) (0) | 2023.01.22 |
보어의 새로운 정의 (0) | 2023.01.21 |