티스토리 뷰

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() ;메서드 이용

;

;

;

;

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함