1. 지속적인 물체의 수명주기
응용 프로그램이 최대 절전 모드 프레임 워크를 사용한 후, 응용 프로그램에 의해 생성 된 지속적인 객체는 전체 수명주기 세트를 거쳐 데이터베이스 작업을 완료하며, 그 중 세 가지 주요 상태는 일시적, 지속성 및 분리 된 것입니다. 이 세 상태의 전환은 아래 그림과 같이 응용 프로그램에서 제어 될 수 있습니다.
이 상태를 명확하게 이해하기 위해서는이 상태의 객체 간의 차이점을 보는 예가 있습니다. 상태의 다음 코드는 다음과 같습니다.
(1) hibernate_session 어셈블리를 만들고 해당 JAR 패키지를 추가하십시오.
(2) 최대 절전 모드를 구성하고 해당 엔티티 사용자 클래스 및 해당 매핑 파일을 추가하고 해당 데이터베이스 연결을 구성합니다.
사용자 클래스 파일 매핑 파일 user.hbm.xml 코드 :
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// hibernate/hibernate 매핑 dtd 3.0 // <hibernate-mapping> <class name = "com.hibernate.user"> <id name = "id"> <generator/> </id> <속성 이름 = "name"/> <property name = "password"/> <property name = "createTime"/> <속성 이름 = "expiretime"/> </class> </hibernate-mapping>
최대 절전 모드 데이터베이스 연결 구성 코드 :
<? xml version = "1.0"encoding = "utf-8"?> <! doctype hibernate-configuration public "-// Hibernate/Hibernate Configuration dtd 3.0 // en" "http://hiberceforge.net/hibernate-configuration-3.0.0.dtd"> <session-factory> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <property name = "hibernate.connection.url"> jdbc : // localhost : 3306/hibernate_session </propertion </propertion </propert </propert </propert </propert </propert </propert </propertion "> <속성 이름 = "hibernate.connection.password"> ab12 </property> <!-방언 : 방언, 캡슐화 된 기본 API는 런타임과 유사하게 데이터베이스를 구성에서 해당 언어로 변환합니다-> <property name = "hibernate.dialect"> hibernate.dialect.mysqnialect </property </property mplect. Resource = "com/hibernate/user.hbm.xml"/> </session-factory> </hibernate-configuration>
(3) Settic Factory 및 해당 세션 객체를 생성하기 위해 정적 회원 세션 Factory의 공개 클래스를 추가합니다.
패키지 com.hibernate; import org.hibernate.session; import org.hibernate.sessionfactory; import org.hibernate.cfg.configuration; 공개 수업 세션 {Private Static SessionFactory Factory; // 정적 로컬 변수 sessionFactory, Database Mirror STATIC {try {// 구성 데이터베이스의 구성 파일을 만들고 가져 와서 hibernate.cfg.xml 구성 cfg = new configuration (). configure (); 공장 = cfg.buildSessionFactory (); // 데이터베이스 이미지 빌드} catch (예외 e) {e.printstacktrace (); // 인쇄 오류 메시지}} public static session getsession () {return factory.opensession (); // 생성 된 세션 객체를 반환} public static sessionfactory getSessionFactory () {return factory; // 해당 SessionFactory를 반환} // 세션 객체를 닫습니다. public static void closesession (세션 세션) {if (session! = null) {if (session.isopen ()) {session.close (); }}}}}(4) 소스 폴더를 추가하고 폴더에 com.hibernate라는 패키지를 추가하고 패키지에 SessionTest라는 클래스 파일을 추가하십시오.
패키지 com.hibernate; import java.util.date; import junit.framework.testcase; import org.hibernate.session; import org.hibernate.Transaction; 공개 클래스 세션 테스트는 테스트 케이스를 확장합니다 {} 2. 상태 변환 방법
1. 객체는 직접 영구 상태로 들어갑니다
1.1 방법을 얻습니다
데이터베이스에서 정보 행을 가져 와서 생성 된 개체와 정보를 동기화하십시오. 이 메소드는 객체 객체를 반환하고 내용이없는 경우 NULL을 반환합니다. 다음 예제는 세션 get 메소드를 사용하여 객체를 얻고 객체를 인스턴스로 변환합니다.
public void testget1 () {세션 세션 = null; 트랜잭션 tx = null; try {session = hibernateutils.getSession (); // 트랜잭션 열기 tx = session.beginTransaction (); // get에 의해로드 된 객체는 지속적인 개체입니다. // execute get get get get get beew에 즉시 쿼리 문을 발행하고, 존재하지 않으면 null user user = (user) session.get (user.class, "ff8080808145bc28cc0145bc28ce020002"); System.out.println (user.getName ()); // 영구 상태 // 객체의 속성이 변경 될 때 영구 상태가있는 객체 // hibernate는 user.setname ( "zhao liu")을 동기화합니다. session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); if (tx! = null) {tx.rollback (); }} 마침내 {hibernateutils.closesession (세션); }} 사용자 객체를 얻으려면 중단 점을 설정하십시오.
이 객체는 얻어지고 캐스팅 후 사용자 객체를 얻습니다. SetName 메소드가 프로그램에 추가되므로 데이터베이스의 이름이 업데이트됩니다. 실행이 완료되면 아래 그림과 같이 데이터베이스를 확인하여 결과를 업데이트합니다.
1.2로드 방법
이 기능은 GET 메소드와 유사하며 데이터베이스에서 데이터를 얻고 객체에 동기화합니다. 이 방법은 게으른 작동을 지원합니다. 지속적인 객체 객체 또는 프록시를 반환하므로 변환해야합니다.
public void testload1 () {세션 세션 = null; try {session = hibernateutils.getSession (); // 부하가 게으른 (지연로드/게으른 부하)를 지원하기 때문에 쿼리 문은 즉시 확인되지 않습니다. // 게으른 가르치는 것은 무엇입니까? 이 객체가 진정으로 사용 된 다음 생성 된 경우에만 최대 절전 모드에 대한 쿼리 문이 발행됩니다. 주로 성능을 향상시키는 것입니다. Lazy는 최대 절전 모드에서 매우 중요한 기능입니다. 최대 절전 모드의 게으른 것은 어떻게 구현됩니까? 프록시 객체에 의해 구현되었습니다. 프록시 객체는 주로 JDK의 동적 프록시 대신 CGLIB 라이브러리에서 생성 된 // 주로 사용합니다. JDK의 동적 프록시는 변명을 구현하는 클래스에 대해서만 프록시를 생성 할 수 있기 때문입니다. cglib는 // 클래스를 생성 할 수 있습니다. 상속 메소드 사용자 user = (user) session.load (user.class, "8A1B653745BCC7B50145BCC7B7B7140001"); System.out.println (user.getName ()); // 영구 상태 // 객체의 속성이 변경 될 때 영구 상태를 가진 개체 // hibernate는 user.setname ( "zhaoliu")을 동기화합니다. session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); } 마침내 {hibernateutils.closesession (세션); }} 아래 그림과 같이 사용자 객체를 얻는 쿼리 :
위의 그림을 분석하면 얻은 사용자 객체는 완전하지 않거나 일반적인 사용자 객체가 없지만 프록시입니다. CGLIB를 사용하여 객체를 사전로드하며 객체를 사용할 때만 실제로 생성됩니다.
1.3 대 부하를 얻습니다
Get and Load 방법은 매우 중요합니다. 그들은 종종 최대 절전 모드와의 인터뷰에서 취합니다. 다음은 다음 두 가지를 비교 한 것입니다.
유사성 :
(1) 함수는 동일하며 관계 데이터는 객체로 변환됩니다.
(2) 사용 방법은 동일하며 매개 변수의 두 가지 차이가 필요합니다.
(1)로드 방법은 게으른 작동을 지원하고 객체를 사전로드하며 사용하는 경우에만 생성됩니다. 관계형 데이터를 객체로 직접 변환합니다.
(2)로드로드 오브젝트가 존재하지 않으면 ObjectNotFoundException이 발생하고 GET가 데이터를 얻지 못하면 NULL을 반환합니다.
2. 분리 된 물체를 수동으로 구성합니다
객체를 얻는 또 다른 방법이 있습니다. GET 및로드 방법과 다릅니다. 수동 방법입니다. 먼저, 객체가 일반적이며, 객체의 데이터는 ID를 공식화하여 얻습니다. 이 방법은 다음과 같습니다.
public void testuer () {세션 세션 = null; try {session = hibernateutils.getSession (); session.begintransaction (); // 수동으로 분리 된 Objectuser user = new user (); user.setId ( "8A1B653745BCC7B50145BCC7B7B7140001"); // 영구 상태 // 객체의 속성이 변경 될 때, 객체의 속성이 변경 될 때 // hibernate는 cache를 청소할 때 session.getTransaction (). commit ()를 동기화합니다 (Dirty Data Check); } catch (예외 e) {e.printstacktrace (); } 마침내 {hibernateutils.closesession (세션); }} 얻은 결과 다이어그램보기 :
분석 결과 다이어그램은 코드에서 객체의 ID 번호를 설정하는 데 사용됩니다. ID 번호가 공식화되면 객체를 작동 할 수 있습니다. 트랜잭션이 제출되면 데이터베이스와 동기화되며 수동 사양은 객체 정보를 수동으로 지정하는 데 사용됩니다.
2.1 삭제 방법
데이터베이스에 지정된 객체를 삭제하려면 객체를 삭제하기 전에 영구 상태로 변환해야합니다. Get, Load 또는 Manual Method를 사용하여 객체를 지정할 수 있습니다. 이 방법은 다음과 같습니다.
세션 = hibernateutils.getSession (); session.begintransaction (); 사용자 user = (사용자) 세션 .LOAD (user.class, "8A1B653745BCC6D50145BCC6D67A0001"); //이 메소드를 사용하여 먼저 삭제하고로드 한 다음 Session.Delete (user)를 삭제하는 것이 좋습니다.
2.2 업데이트
데이터를 업데이트하면이 메소드는 데이터베이스의 데이터를 수정합니다. 그것을 사용할 때는 수량에 상황이 있으며, 이는 데이터베이스의 특정 필드 값을 업데이트하거나 데이터베이스의 전체 행을 업데이트합니다.
2.2.1 필드 값을 업데이트하십시오
특정 필드의 값 만 업데이트하려면 업데이트하기 전에로드를 사용하거나 객체를 다음과 같이 영구 상태 코드로 변환해야합니다.
// 세션 객체 객체 세션을 가져옵니다. // 트랜잭션 열기 세션 .BegIntransaction (); // 또는 다른 메소드를 사용하여 //session.getTransaction (). 시작 (); // 사용자 객체를 얻기 위해로드 // 메소드 1 :로드 메소드 사용 // 사용자 user = (user) session.load (user.class, "8a1b653745bcc7b50145bcc7b7b7140001"); // 메소드 2 : 수동으로 사용자 user = new user (); user.setId ( "8A1B653745BCC7B50145BCC7B7B7140001"); // 이름 user.setName ( "Zhangsan")을 업데이트합니다. 세션 .update (사용자); session.getTransaction (). commit ();
2.2.2 전체 라인 <br /> 전체 라인의 데이터를 업데이트하려면 상태를 분리 된 상태로 수동으로 변환하고 개체의 ID 값을 수동으로 지정할 수 있습니다. 코드는 다음과 같습니다.
// 세션 객체 객체 세션을 가져옵니다. // 트랜잭션 열기 세션 .BegIntransaction (); // 또는 다른 메소드를 사용하여 //session.getTransaction (). 시작 (); // 수동으로 사용자 user = new user (); user.setId ( "8A1B653745BCC7B50145BCC7B7B7140001"); // 이름 user.setName ( "Zhangsan")을 업데이트합니다. 세션 .update (사용자); session.getTransaction (). commit ();
업데이트 결과보기 :
업데이트 결과를 분석하면 실제로 데이터베이스의 전체 데이터 행을 업데이트합니다. 이 업데이트 작업에는 불확실성이 너무 많으며 사용하는 것이 좋습니다.
2.3 메소드 저장
데이터 삽입. 저장 메소드를 실행할 때 데이터베이스 삽입 문은 데이터베이스에 새 행을 추가하도록 호출됩니다. 저장된 객체는 영구 상태로 변환됩니다. 이 상태에서 객체는 객체를 다시 업데이트 할 수 있으며 트랜잭션이 마지막으로 제출 될 때 변경 사항으로 데이터베이스로 업데이트됩니다. 다음과 같이 :
public void testsave2 () {세션 세션 = null; 트랜잭션 tx = null; try {session = hibernateutils.getSession (); // 트랜잭션 열기 tx = session.beginTransaction (); // 과도 상태 사용자 user = 새 사용자 (); user.setName ( "Zhangsi"); user.setpassword ( "123"); user.setcreateTime (새 날짜 ()); user.setexpiretime (new date ()); // 영구 상태 // 객체의 속성이 변경 될 때 영구 상태가 변경되는 객체 // hibernate는 session.save (user)를 동기화합니다. user.setName ( "lisi"); tx.commit (); } catch (예외 e) {e.printstacktrace (); if (tx! = null) {tx.rollback (); }} 마침내 {hibernateutils.closesession (세션); } // 분리 상태} 이전 예제 실행 결과보기보기 :
분석 결과 : 세션은 실제로 거래를 제출할 때 두 가지 작업을 수행합니다. 코드의 업데이트 프로세스와 결합하여 먼저 새 사용자 객체가 추가 된 다음 저장 작업이 실행됩니다. 삽입 문을 호출 한 다음 SetName 작업이 코드에서 수행되며 이름은 다시 수정됩니다. 그러나 현재 데이터베이스와 동기화되지 않았지만 메모리에 있습니다. 현재 두 상태가있을 것입니다. 현재 데이터 비트는 더러운 데이터라고 말하며 마지막으로 트랜잭션을 제출할 때 데이터베이스로 업데이트됩니다.