주석
Hibernate Annotation은 XML 파일을 사용하여 매핑을 정의하지 않는 최신 방법입니다. 주석은 분리되거나 교체 된 XML 매핑 메타 데이터에 사용할 수 있습니다.
Hibernate의 주석은 메타 데이터 객체와 관계형 테이블의 매핑을 제공하는 강력한 방법입니다. 모든 메타 데이터는 Pojo Java 파일과 함께 해당됩니다. 이를 통해 사용자는 개발 과정에서 테이블의 구조와 Pojo를 이해하는 데 도움이 될 수 있습니다.
응용 프로그램을 다른 EJB3 특정 ORM 애플리케이션으로 포트하려는 경우 주석을 사용하여 매핑 정보를 나타내야하지만 유연성이 높아지면 XML 기반 매핑을 사용해야합니다.
환경에서 최대 절전 모드 주석을 먼저 설정하자면 먼저 JDK5.0을 사용하고 있는지 확인해야합니다. 그렇지 않으면 JDK를 JDK5.0 기본 지원으로 업그레이드해야합니다.
둘째, Hibernate의 3.x 주석 분포 패키지를 설치해야합니다. Sourceforge : (최대 절전 모드 주석을 다운로드하고) Hibernate-Annotations.jar, lib/hibernate-comons- nantations.jar 및 lib/ejb3-persistence.jar에서 최대원 주석에서 Hibernate-Annations의 할당까지 복사 할 수 있습니다.
주석은 수업 인스턴스 :
언급 한 바와 같이, 최대 절전 모드 주석과 함께 작동하는 모든 메타 데이터는 위의 Pojo Java 파일로 작동하면 사용자가 개발 중에 테이블 구조와 Pojo를 모두 이해하는 데 도움이 될 수 있습니다.
다음 직원 테이블을 사용하여 저장 될 객체를 고려하십시오.
테이블 직원 생성 (id int null auto_increment, first_name varchar (20) 기본 널, last_name varchar (20) 기본 널, 급여 int 기본 널, 기본 키 (id));
다음은 정의 된 직원 테이블에 매핑 할 주석이있는 객체 직원 클래스를 매핑하는 것입니다.
import javax.persistence.*; @entity @table (name = "Employee") 공개 클래스 직원 {@id @generatedvalue @column (name = "id") private int id; @Column (이름 = "First_Name") 개인 문자열 FirstName; @column (이름 = "last_name") 개인 문자열 마지막 이름; @column (이름 = "급여") 개인 int 급여; 공공 직원 () {} public int getId () {return id; } public void setid (int id) {this.id = id; } public String getFirstName () {return firstName; } public void setFirstName (String First_Name) {this.firstName = first_name; } public String getLastName () {return lastName; } public void setLastName (string last_name) {this.lastname = last_name; } public int getSalary () {반환 급여; } public void setSalary (int 급여) {this.salary = 월급; }}Hibernate는 @ID 주석이 필드에 대한 것이라는 것을 감지하고 런타임 도메인을 통해 직접 객체의 속성에 액세스해야한다고 가정합니다. @id에 getId () 메소드로 주석이 달린 경우 Getter 및 Setter 메소드를 통해 기본적으로 속성에 액세스됩니다. 따라서 다른 모든 의견은 정책 아래에서 선택한대로 필드 또는 getter 메소드에도 배치됩니다. 다음 섹션에서는 위의 수업에 사용 된 의견을 설명합니다.
@Entity 주석 :
EJB3 사양 설명은 javax.persistence 패키지에 포함 되므로이 패키지를 첫 번째 단계로 가져옵니다. 둘째, 우리는 @entity 주석을 사용 하여이 클래스를 Entity Bean Employee 클래스로 표시하므로 매개 변수가없는 생성자가 있어야하므로 최종적으로 보호 기능이 보입니다.
@Table 주석 :
@Table 주석을 사용하면 지정된 테이블을 사용하여 데이터베이스의 엔터티에 대한 자세한 정보를 보유 할 수 있습니다.
@Table 주석은 테이블 이름, 디렉토리, 스키마 및 테이블의 열에서 고유 한 제약 조건을 실행할 수있는 4 가지 속성을 제공합니다. 이제 우리는 지금 직원 테이블의 이름을 사용하고 있습니다.
@id 및 @generatedvalue 주석 :
각 엔티티 Bean은 클래스의 @ID 주석에 주석이 달린 기본 키가 있습니다. 기본 키는 테이블 구조에 따라 단일 필드 또는 여러 필드의 조합 일 수 있습니다.
기본적으로 @ID 주석은 사용할 가장 적절한 주요 키 생성 전략을 자동으로 결정하지만 여기에서 논의하지 말고 두 가지 매개 변수, 전략 및 생성기를 허용하는 @generatedValue 주석을 적용하여 사용할 수 있습니다. 기본 기본 키 생성 전략을 사용하십시오. 최대 절전 모드가 다른 데이터베이스간에 코드 휴대 성을 만들기 위해 사용할 생성기 유형을 결정하십시오.
@column 주석 :
@Column 주석은 매핑 될 필드 또는 속성에 열의 세부 사항을 지정하는 데 사용됩니다. 다음과 같은 가장 일반적으로 사용되는 특성은 열을 사용하여 주석을 달 수 있습니다.
이름 속성을 사용하면 열의 이름을 명시 적으로 지정할 수 있습니다.
길이 속성을 사용하면 특히 문자열 값에 대한 열의 크기를 매핑 할 수 있습니다.
무효화 가능한 속성을 사용하면 스키마를 생성 할 때 열을 표시 할 수 있습니다.
고유 한 속성을 사용하면 고유 한 값 만 포함 된 열을 허용합니다.
응용 프로그램 클래스 생성 :
마지막으로 응용 프로그램 클래스의 Main () 메소드를 작성하여 응용 프로그램을 실행합니다. 우리는이 앱을 사용하여 일부 직원 기록을 저장 한 다음 CRUD 운영에 대한 레코드를 신청할 것입니다.
Java.util.list 가져 오기; import java.util.date; import java.util.iterator; import org.hibernate.hibernateException; import org.hibernate.session; import org.hibernate.transaction; import org.hibernate.cfg.annotationconfiguration; import org.hibernate.sessionfactory; import org.hibernate.cfg.configuration; public class manageemployee {private static sessionfactory factory; public static void main (String [] args) {try {factory = new AnnotationConfiguration (). 구성 (). //addpackage("com.xyz ") // 사용 된 경우 패키지를 추가하십시오. AddAnnotatedClass (Employee.class). buildSessionFactory (); } catch (Throwable ex) {System.err.println ( "SessionFactory 객체를 생성하지 못했습니다." + ex); 새로운 예외를 던지십시오. } manageemployee me = new manageemployee (); / * 데이터베이스에 직원 기록이 거의 없습니다. */ Integer Empid1 = Me.addemployee ( "Zara", "Ali", 1000); 정수 Empid2 = Me.addemployee ( "Daisy", "Das", 5000); 정수 Empid3 = Me.addemployee ( "John", "Paul", 10000); / * 모든 직원을 나열하십시오 */ me.listemployee (); / * 직원의 기록 업데이트 */ me.updateemployee (Empid1, 5000); / * 데이터베이스에서 직원을 삭제 */ me.deleteemployee (EMPID2); / * 직원의 새 목록을 나열 */ me.listemployee (); } / * 데이터베이스에서 직원을 생성하는 방법 * / public integer addemployee (String fname, String Lname, int Salary) {세션 세션 = factory.opensession (); 트랜잭션 tx = null; 정수 EmployeeId = null; try {tx = session.begintransaction (); 직원 직원 = 새로운 직원 (); Employee.setFirstName (fname); Employee.setLastName (lname); Employee.SetSalary (급여); EmployeeId = (Integer) Session.Save (직원); tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); } return EmployeeId; } / * 모든 직원을 읽는 방법 * / public void listemployees () {세션 세션 = factory.opensession (); 트랜잭션 tx = null; try {tx = session.begintransaction (); List Employees = session.createrecer ( "직원에서"). list (); for (iterator iterator = Employegator (); iterator.hasnext ();) {Employee Employee = (Employee) iterator.next (); System.out.print ( "이름 :" + Employee.getFirstName ()); System.out.print ( "성 :" + Employee.getLastName ()); System.out.println ( "급여 :" + Employee.getSalary ()); } tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); }} / * 직원에 대한 급여를 업데이트하는 방법 * / public void updateemployee (Integer EmployeeId, int 월급) {세션 세션 = inctory.opensession (); 트랜잭션 tx = null; try {tx = session.begintransaction (); Employee Employee Employee = (Employee) Session.get (Employee.class, EmployeeId); Employee.SetSalary (급여); 세션 .update (직원); tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); }} / * 레코드에서 직원을 삭제하는 방법 * / public void deleteemployee (Integer EmployeeId) {세션 세션 = inctory.opensession (); 트랜잭션 tx = null; try {tx = session.begintransaction (); Employee Employee Employee = (Employee) Session.get (Employee.class, EmployeeId); 세션 .Delete (직원); tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); }}} 데이터베이스 구성 :
이제 데이터베이스의 관련 매개 변수를 정의하기 위해 hibernate.cfg.xml 구성 파일을 만들어 봅시다.
<? xml version = "1.0"alcoding = "utf-8"?> <! doctype hibernate-configuration system "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <Session-Factory> <속성 이름 = Hibernate.dialet " org.hibernate.dialect.mysqldialect </property> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <!-학생들이 데이터베이스 이름이라고 가정합니다.> <속성 이름 = "hibernate.connection.url"> 이름 = "hibernate.connection.username"> root </property> <property name = "hibernate.connection.password"> cohondob </property> </session-factory> </hibernate-configuration>
컴파일 및 실행 :
위의 응용 프로그램을 컴파일하고 실행하는 단계는 다음과 같습니다. 컴파일 및 실행 전에 경로와 클래스 경로가 적절하게 설정되어 있는지 확인하십시오.
경로에서 Employee.hbm.xml 매핑 파일을 제거하십시오.
위의 이미지에 표시된대로 Employee.java 소스 파일을 작성하여 컴파일하십시오.
위의 이미지에 표시된대로 Manageemployee.java 소스 파일을 작성하여 컴파일하십시오.
프로그램을 실행하려면 ManageEmployee Binary 파일을 실행하십시오.
다음 결과가 얻어지고 기록은 직원 테이블에 있습니다.
$ java manageemployee ......... 다양한 로그 메시지가 표시됩니다 ......... 이름 : Zara 성 : 알리 급여 : 10000 위의 이름 : DASY SALERY : 5000FIRST 이름 : 5000 FIRST NAME : JOHN SELARY : 100000FIRST 이름 : ZARA 성직 : 5000First 이름 : John 성직 : 100000
직원 테이블을 확인하면 다음 기록이 있어야합니다.
MySQL> 직원에서 *+----+---------------------------------+| id | First_name | Last_name | 급여 |+----+------------------------------+| 29 | 자라 | 알리 | 5000 || 31 | 존 | 폴 | 100000 |+----+------------+------------------+2 행 세트 (0.00 SecMySql>
은닉처
캐싱은 애플리케이션의 성능 최적화에 관한 것이며 응용 프로그램과 데이터베이스 사이에 여러 데이터베이스 액세스를 피하고 성능 크리티컬 애플리케이션이 더 나은 성능을 발휘할 수 있도록합니다.
캐싱은 최대 절전 모드에 중요하며 아래에 설명 된 다단계 캐싱 체계를 채택합니다.
레벨 1 캐시 :
첫 번째 레벨 캐시는 세션 캐시이며 필수 캐시이며 모든 요청을 통과해야합니다. 세션 객체는 데이터베이스에 제출하기 전에 객체에 의해 지속적으로 전원을 공급받습니다.
여러 업데이트가 발행되면 최대 절전 모드는 발행 된 SQL 문의 업데이트 수를 줄이기 위해 가능한 한 오랫동안 업데이트를 지연 시키려고 시도합니다. 세션을 닫으면 모든 캐시 된 객체가 데이터베이스에서 영구적이거나 업데이트됩니다.
레벨 2 캐시 :
레벨 2 캐시는 옵션의 레벨 2 캐시를 찾기 전에 항상 찾는 옵션 및 레벨 1 캐시입니다. 두 번째 레벨 캐시는 수업 별 및 범주별로 구성 할 수 있으며, 주로 세션에서 캐시 된 객체를 담당합니다.
모든 타사 캐시는 최대 절전 모드를 사용할 수 있습니다. org.hibernate.cache.cacheprovider 인터페이스는 제공하며 최대 절전 모드를 제공하기위한 핸들 캐시 구현을 구현해야합니다.
쿼리 레벨 캐시 :
Hibernate는 또한 쿼리 결과 세트 캐시 및 레벨 2 캐시의 엄격한 통합을 구현합니다.
캐시 된 쿼리 결과를 저장하기 위해 두 개의 추가 물리적 캐시와 테이블이 마지막으로 업데이트 될 때 영역을 저장 해야하는 옵션 기능입니다. 이것은 종종 동일한 매개 변수로 실행되는 쿼리에 매우 유용합니다.
레벨 2 캐시 :
Hibernate는 레벨 1 캐시를 사용합니다. 기본적으로 레벨 1 캐시로 아무것도하지 않습니다. 옵션 두 번째 레벨 캐시로 바로 가자. 모든 클래스가 캐싱으로 인한 혜택을받는 것은 아니므로 레벨 2 캐시를 비활성화하는 것이 중요합니다.
최대 절전 모드 레벨 2 캐시가 두 단계로 설정됩니다. 먼저 사용할 동시성 전략을 결정해야합니다. 그런 다음 캐시 만료를 구성하고 캐시를 사용하여 물리적 캐시 속성을 제공 할 수 있습니다.
동시성 전략 :
동시성 정책은 캐시에 데이터 항목을 저장하고 캐시에서 검색하는 중재자입니다. 레벨 2 캐싱을 활성화하려면 각 영구 클래스 및 컬렉션에 사용할 캐시 동시성 정책을 결정해야합니다.
트랜잭션 :이 전략을 사용하여 구식 데이터의 동시 트랜잭션을 방지하기 위해 주로 데이터를 읽는 것이 드문 업데이트의 경우 중요합니다.
읽기 쓰기 :이 전략을 사용 하여이 전략을 사용하여 드문 업데이트의 경우 동시 트랜잭션이 오래된 데이터에서 동시 거래를 방지하는 데 중요합니다.
NAMPLEST-READ-WRITE :이 전략은 캐시와 데이터베이스 간의 일관성을 보장하지 않습니다. 이 전략을 사용하면 데이터가 거의 변경되지 않고 오래된 데이터의 가능성이 부실한 경우 핵심은주의를 기울이지 않는 것입니다.
읽기 전용 : 동시성 정책은 데이터에 적합하며 결코 변경되지 않습니다. 사용 된 데이터는 참조 용입니다.
직원 클래스로 두 번째 레벨 캐시를 사용하려면 Hibernate에 직원 인스턴스에 대한 읽기 가능하고 쓰기 쉬운 캐시 정책을 사용하도록 필요한 매핑 요소를 추가하겠습니다.
<? xml version = "1.0"encoding = "utf-8"?> <! doctype hibernate-mapping public "-// hibernate mapping dtd // en" "http://www.hibernate.org/dtdd/hibernate-mapping-3.0.dtd"> <ClasseMApping> ""Hibernate> " table = "Employee"> <meta attribute = "class-description">이 클래스에는 직원 세부 사항이 포함되어 있습니다. </meta> <cache usage = "read-write"/> <id name = "id"type = "int"column = "id"> <generator/</id> <property name = "firstname"column = "first_name"type = "string"/> <property name = "lastname"column = "last_name"type = "string" "salary"sylary "int". </class> </hibernate-mapping>
usage = "read-write"속성은 최대 절전 모드에게 읽기 작성 동시성 정책으로 정의 된 캐시를 사용하도록 지시합니다.
캐시 제공자 :
캐시 후보 클래스의 동시성 정책을 고려한 후 다음 단계는 캐시 제공 업체를 선택하는 것입니다. 최대 절전 모드 전체 애플리케이션을 제공하기 위해 캐시를 선택합니다.
지정된 hibernate.cfg.xml 구성 파일에 제공된 캐시. 두 번째 레벨 캐시 제공 업체로 ehcache를 선택하십시오.
<? xml version = "1.0"alcoding = "utf-8"?> <! doctype hibernate-configuration system "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <Session-Factory> <속성 이름 = Hibernate.dialet " org.hibernate.dialect.mysqldialect </property> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <!-학생들이 데이터베이스 이름이라고 가정합니다.> <속성 이름 = "hibernate.connection.url"> 이름 = "hibernate.connection.username"> root </property> <속성 이름 = "hibernate.connection.password"> root123 </property> <property name = "hibernate.cache.provider_class"> org.hibernate.cache.ehcacheprovider </property> <!- XML Mapping-mapping-mappe Resource = "Employee.hbm.xml"/> </session-factory> </hibernate-configuration>
이제 캐시 영역의 속성을 지정해야합니다. Ehcache에는 클래스 경로 응용 프로그램에 자체 구성 파일 ehcache.xml이 있습니다. ehcache.xml에서 직원 클래스 캐시 구성이 다음과 같습니다.
<diskstore path = "java.io.tmpdir"/> <defaultCacheMaxElementsInMemory = "1000"Eternal = "False"Timetoidleseconds = "120"Timetoliveseconds = "120"OverFlowTodisk = "true"/> <Cache 이름 = "Employee"maxelementsInmemory = "500"Eternal = "true"timetoidleseconds = "0"Timetoliveseconds = "0"OverFlowTodisk = "false"/>
이제 직원에게 브라우징 할 때마다 또는 직원이 식별자로로드 될 때마다 직원 클래스의 보조 캐시 및 최대 절전 모드가 2 차 캐시를 가질 수 있습니다.
모든 클래스를 분석하고 각 클래스에 대한 적절한 캐싱 전략을 선택해야합니다. 때로는 보조 캐시가 응용 프로그램의 성능을 저하시킬 수 있습니다. 따라서 처음으로 캐싱을 가능하게하지 않는 벤치 마크 애플리케이션에 권장되며, 이는 캐싱 및 점검 성능에 매우 적합합니다. 캐시가 시스템 성능을 향상시키지 않으면 모든 유형의 캐시를 만드는 것은 의미가 없습니다.
쿼리 레벨 캐시 :
쿼리 캐시를 사용하면 hibernate.cache.use_query_cache = "true"속성 구성 파일에서 먼저 활성화해야합니다. 이 속성이 true로 설정된 경우 최대 절전 모드를 메모리에서 필요한 캐시를 작성하여 쿼리 및 식별자 세트를 저장하십시오.
다음으로 쿼리 캐시를 사용하면 쿼리 클래스의 SetCachable (부울) 메소드를 사용할 수 있습니다. 예를 들어:
Hibernate는 또한 캐시 영역의 개념을 통해 매우 세밀한 캐시 지원을 지원합니다. 캐시는 이름이 주어진 캐시의 일부입니다.
이 코드는 메소드를 사용하여 Hibernate에게 캐시의 직원에게 쿼리를 저장하고 찾도록 지시합니다.