Hibernate -- 세 션 (二) 상세 설명
(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 () 등 을 통 해 탈 관 대상 을 영구적 인 대상 으로 바 꿉 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
SSH를 통해 MySQL 연결 -> SQL 실행을 한 번에하려고 헛된 이야기SSH 경유로 MySQL 접속->SQL 실행을 1발로 하는 것으로-! ! (`Δ´) 1. 우선, 발판 서버에 액세스하기 때문에 2.다음에 mysql에 접속하고 싶으니까 3. 마지막으로 실행하려는 SQL은 4. 이 3...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.