Hibernate -- 세 션 (二) 상세 설명

6359 단어 SSHHibernate
이 글 은 세 션 을 어떻게 얻 는 지 에 대해 세 션 이 데이터베이스 조작 과 세 션 의 세 가지 상 태 를 소개 했다.
(1) session 데이터베이스 조작
데이터베이스 시트 만 들 기
create table user(id int not null primary key auto_increment,username varchar(50),userpass varchar(50));

데이터 베 이 스 는 세 필드, id, 사용자 이름, 사용자 비밀번호 에 대응 합 니 다.
프로젝트 의 Entity 클래스 는 User 입 니 다.
public class User {
	private int id;
	private String username;
	private String userpass;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getUserpass() {
		return userpass;
	}
	public void setUserpass(String userpass) {
		this.userpass = userpass;
	}
}

1. 증가
자바 웹 프로젝트 를 새로 만 들 고, 상응하는 jar 패 키 지 를 가 져 오고, 상응하는 model 패 키 지 를 만 들 고, User 클래스 를 새로 만 들 고, 상응하는 User. hbm. xml 파일 을 만 듭 니 다.
public class Test {
	public static void main(String args[]) {
		Configuration config = new Configuration()
				.configure("/hibernate.cfg.xml");
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		User user = new User();
		user.setUsername("  ");
		user.setUserpass("123");
		session.save(user);
		tx.commit();
	}

}

save () 이후 에 바로 자료 라 이브 러 리 를 업데이트 하지 않 고 Transaction 의 commt () 이후 에 야 데이터 베 이 스 를 업데이트 할 수 있 습 니 다. Transaction 간 의 작업 이 모두 성공 하려 면 모두 실패 하고 업데이트 가 실패 하면 자료 라 이브 러 리 차원 에서 모든 업데이트 작업 을 취소 합 니 다. 그러나 메모리 에 있 는 영구적 인 아 이 템 은 원래 상태 로 돌아 가지 않 습 니 다. 사실은...Transaction 이 실패 하면 이번 세 션 은 바로 효력 을 잃 고 모든 메모리 에 있 는 아 이 템 을 포기 해 야 합 니 다. 원본 으로 업데이트 하 는 동작 을 시도 하 는 것 이 아 닙 니 다.2. 삭제
public class Test {
	public static void main(String args[]) {
		Session session = HibernateSessionFactory.getSession();
		Transaction tx = session.beginTransaction();
		User user = (User) session.get(User.class, new Integer(2));
		session.delete(user);
		tx.commit();
		session.close();
	}
}

3. 변경 (업데이트)
public class Test {
	public static void main(String args[]) {
		Session session = HibernateSessionFactory.getSession();
		Transaction tx = session.beginTransaction();
		User user = (User) session.get(User.class, new Integer(2));
		tx.commit();
		session.close();
		user.setUsername("  ");
		session = HibernateSessionFactory.getSession();    
		tx= session.beginTransaction(); 
		session.update(user);
		tx.commit();
		session.close();

	}
}

session 이 닫 힌 후 새로운 session 을 얻어 데 이 터 를 처리 해 야 합 니 다.
4. 조사
get () 또는 load () 방법 으로 id 를 2 의 대상 으로 가 져 옵 니 다.
일치 하 는 자 료 를 발견 하지 못 하면 get () 방법 은 null 로 돌아 가 고 load () 방법 은 Object NotFoundException 을 잃 어 버 립 니 다. 진급 응용 에서 load () 방법 은 대리 (proxy) 물건 을 되 돌려 주 고 필요 할 때 만 자료 실 을 진정 으로 조회 하여 대응 하 는 자 료 를 얻 을 수 있 으 며 빠 른 접근 체 제 를 충분히 이용 할 수 있 습 니 다.Hibernate 3 에서 find () 방법 을 취 소 했 습 니 다. Query 나 Criteria 를 통 해 자 료 를 조회 해 야 합 니 다.
public class Test {
	public static void main(String args[]) {
		Session session = HibernateSessionFactory.getSession();
		Transaction tx = session.beginTransaction();
		User user = (User) session.get(User.class, new Integer(2));
		tx.commit();
		session.close();

	}
}

병합 상태
public class Test {
	public static void main(String args[]) {
		Session session = HibernateSessionFactory.getSession();
		Transaction tx = session.beginTransaction();
		User user = (User) session.get(User.class, new Integer(2));
		tx.commit();
		session.close();
		user.setUsername("   ");

		session = HibernateSessionFactory.getSession();    
		tx= session.beginTransaction(); 
		User user2 = (User) session.get(User.class, new Integer(2)); //    id
		// user1 == user2   false
		session.update(user); //   NonUniqueObjectException
		tx.commit();
		session.close();

	}
}

update () 를 진행 하기 전에 데이터베이스 에서 다른 자 료 를 얻 은 다음 user 1 을 업데이트 하려 고 시도 합 니 다. 현재 Persistence context 에 자 료 를 불 러 왔 고 같은 id 의 User 인 스 턴 스 가 있 기 때문에 같은 Persistence context 에 같은 id 의 인 스 턴 스 가 두 개 없 기 때문에 NonUniqueObject Exception 을 잃 어 버 렸 습 니 다.
public class Test {
	public static void main(String args[]) {
		Session session = HibernateSessionFactory.getSession();
		Transaction tx = session.beginTransaction();
		User user = (User) session.get(User.class, new Integer(2));
		tx.commit();
		session.close();
		user.setUsername("   ");

		/*session = HibernateSessionFactory.getSession();    
		tx= session.beginTransaction(); 
		User user2 = (User) session.get(User.class, new Integer(2)); //    id
		// user1 == user2   false
		session.update(user); //   NonUniqueObjectException
		tx.commit();
		session.close();*/
		session=HibernateSessionFactory.getSession();
		tx=session.beginTransaction();
		User user2=(User)session.get(User.class,new Integer(2));
		User user3=(User)session.merge(user);
		tx.commit();
		session.close();

	}
}

(2) session 의 세 가지 상태
과도:
new 명령 으로 메모리 공간 을 만 드 는 새로운 대상, 즉 model 층 을 만 드 는 클래스 대상 입 니 다.
User user = new User();
순식간 의 특징:
1) 대상 이 session 와 연결 되 지 않 음
2) 데이터베이스 에 과도 대상 과 연 결 된 대상 이 없다.
지속 상태: 지속 적 인 인 인 스 턴 스 는 데이터베이스 에 대응 할 확률 이 있 고 지속 적 인 표지 (identifier) 를 가지 고 있 습 니 다.
지구 화 대상 은 항상 Session 과 Transaction 과 연결 되 어 있 습 니 다. 한 Session 에서 지구 화 대상 에 대한 변 화 는 데이터 베 이 스 를 바로 변경 하지 않 고 Transaction 이 종료 되 어야 합 니 다. 즉, commt () 를 실행 한 후에 야 데이터 베이스 에서 SQL 을 진정 으로 실행 하여 변경 하고 지구 대상 의 상 태 는 데이터 베이스 와 동기 화 됩 니 다.동기 화 되 기 전의 지속 적 인 대상 은 더러 운 대상 이 된다.
과도 변환 대상:
1) 세 션 의 save () 와 saveOrUpdate () 방법 을 통 해 순간 대상 을 데이터베이스 와 연결 시 키 면 이 순간 대상 은 지구 화 대상 이 된다.
지구 화 대상 의 특징:
(1) Session 인 스 턴 스 와 연결
(2) 데이터베이스 에 영구적 인 대상 과 관련 된 기록 이 있다.
3. 위탁 관리 상태 (Detached)
지구 대상 과 연 결 된 세 션 이 닫 히 면 대상 이 탈 관 대상 이 되 는 것 과 같다.탈 관 대상 에 대한 인용 은 여전히 유효 하 며 대상 은 계속 수정 할 수 있다.
위탁 관리 대상 의 특징:
1) 본질 적 으로 과도 대상 과 동일
2) 과도 대상 보다 데이터베이스 로고 값 id 가 더 많 을 뿐
지구 대상 을 탈 관 대상 으로 변환:
close () 또는 clear (), evict () 를 실행 하면 영구적 인 대상 이 탈 관 대상 이 됩 니 다.
과도 대상 이 지구 대상 으로 전환 하 다.
세 션 의 update (), saveOrUpadate, lock () 등 을 통 해 탈 관 대상 을 영구적 인 대상 으로 바 꿉 니 다.
 

좋은 웹페이지 즐겨찾기