최대 절전 모드-주석
지금까지 Hibernate가 POJO에서 데이터베이스 테이블로 또는 그 반대로 데이터를 변환하기 위해 XML 매핑 파일을 사용하는 방법을 보았습니다. Hibernate 주석은 XML 파일을 사용하지 않고 매핑을 정의하는 가장 새로운 방법입니다. XML 매핑 메타 데이터에 추가로 또는 대체로 주석을 사용할 수 있습니다.
Hibernate Annotations는 객체 및 관계형 테이블 매핑에 대한 메타 데이터를 제공하는 강력한 방법입니다. 모든 메타 데이터는 코드와 함께 POJO 자바 파일에 포함되어 사용자가 개발 중에 테이블 구조와 POJO를 동시에 이해하는 데 도움이됩니다.
응용 프로그램을 다른 EJB 3 호환 ORM 응용 프로그램에 이식 할 수 있도록 만들려면 주석을 사용하여 매핑 정보를 나타내야하지만 여전히 더 큰 유연성을 원한다면 XML 기반 매핑을 사용해야합니다.
Hibernate Annotation을위한 환경 설정
우선 JDK 5.0을 사용하고 있는지 확인해야합니다. 그렇지 않으면 주석에 대한 기본 지원을 활용하기 위해 JDK를 JDK 5.0으로 업그레이드해야합니다.
둘째, sourceforge에서 사용할 수있는 Hibernate 3.x 주석 배포 패키지를 설치해야합니다. ( Hibernate Annotation 다운로드 ) 및 복사hibernate-annotations.jar, lib/hibernate-comons-annotations.jar 과 lib/ejb3-persistence.jar Hibernate Annotations 배포에서 CLASSPATH로.
주석이 달린 클래스 예
Hibernate Annotation으로 작업하는 동안 위에서 언급했듯이 모든 메타 데이터는 코드와 함께 POJO Java 파일에 포함되어 사용자가 개발 중에 테이블 구조와 POJO를 동시에 이해하는 데 도움이됩니다.
다음 EMPLOYEE 테이블을 사용하여 객체를 저장한다고 가정합니다.
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
다음은 정의 된 EMPLOYEE 테이블로 객체를 매핑하는 주석이있는 Employee 클래스의 매핑입니다.
import javax.persistence.*;
@Entity
@Table(name = "EMPLOYEE")
public class Employee {
@Id @GeneratedValue
@Column(name = "id")
private int id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "salary")
private int salary;
public Employee() {}
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() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Hibernate는 @Id 주석이 필드에 있음을 감지하고 런타임시 필드를 통해 직접 객체의 속성에 액세스해야한다고 가정합니다. getId () 메서드에 @Id 주석을 배치 한 경우 기본적으로 getter 및 setter 메서드를 통해 속성에 액세스 할 수 있습니다. 따라서 다른 모든 주석도 선택한 전략에 따라 필드 또는 getter 메서드에 배치됩니다.
다음 섹션에서는 위 클래스에서 사용 된 주석을 설명합니다.
@Entity 주석
EJB 3 표준 주석은 javax.persistence이 패키지를 첫 번째 단계로 가져옵니다. 둘째, 우리는@Entity 이 클래스를 엔티티 빈으로 표시하는 Employee 클래스에 대한 주석이므로 최소한 보호 된 범위에서 볼 수있는 인수가없는 생성자가 있어야합니다.
@ 테이블 주석
@Table 주석을 사용하면 데이터베이스에서 엔터티를 유지하는 데 사용할 테이블의 세부 정보를 지정할 수 있습니다.
@Table 주석은 네 가지 속성을 제공하므로 테이블 이름, 카탈로그 및 스키마를 재정의하고 테이블의 열에 고유 한 제약 조건을 적용 할 수 있습니다. 지금은 EMPLOYEE라는 테이블 이름 만 사용합니다.
@Id 및 @GeneratedValue 주석
각 엔티티 빈에는 기본 키가 있으며,이 키는 @Id주석. 기본 키는 테이블 구조에 따라 단일 필드 또는 여러 필드의 조합 일 수 있습니다.
기본적으로 @Id 주석은 사용할 가장 적합한 기본 키 생성 전략을 자동으로 결정하지만 다음을 적용하여이를 재정의 할 수 있습니다. @GeneratedValue 두 개의 매개 변수를 사용하는 주석 strategy 과 generator여기서 논의하지 않을 것이므로 기본 키 생성 전략 만 사용하겠습니다. Hibernate가 사용할 생성기 유형을 결정하도록하면 다른 데이터베이스간에 코드를 이식 할 수 있습니다.
@ 열 주석
@Column 주석은 필드 또는 속성이 매핑 될 열의 세부 정보를 지정하는 데 사용됩니다. 다음과 같이 가장 일반적으로 사용되는 속성으로 열 주석을 사용할 수 있습니다.
name 속성을 사용하면 열 이름을 명시 적으로 지정할 수 있습니다.
length 속성은 특히 문자열 값에 대한 값을 매핑하는 데 사용되는 열의 크기를 허용합니다.
nullable 속성은 스키마가 생성 될 때 열이 NOT NULL로 표시되도록 허용합니다.
unique 속성을 사용하면 고유 한 값만 포함하는 것으로 열을 표시 할 수 있습니다.
애플리케이션 클래스 생성
마지막으로 응용 프로그램을 실행하기 위해 main () 메서드를 사용하여 응용 프로그램 클래스를 만듭니다. 이 애플리케이션을 사용하여 직원의 기록을 거의 저장하지 않은 다음 해당 기록에 CRUD 작업을 적용합니다.
import 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().
configure().
//addPackage("com.xyz") //add package if used.
addAnnotatedClass(Employee.class).
buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Add few employee records in database */
Integer empID1 = ME.addEmployee("Zara", "Ali", 1000);
Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
Integer empID3 = ME.addEmployee("John", "Paul", 10000);
/* List down all the employees */
ME.listEmployees();
/* Update employee's records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down new list of the employees */
ME.listEmployees();
}
/* Method to CREATE an employee in the database */
public Integer addEmployee(String fname, String lname, int salary){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try {
tx = session.beginTransaction();
Employee employee = new Employee();
employee.setFirstName(fname);
employee.setLastName(lname);
employee.setSalary(salary);
employeeID = (Integer) session.save(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
return employeeID;
}
/* Method to READ all the employees */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator = employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
}
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
/* Method to UPDATE salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Employee employee = (Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
/* Method to DELETE an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Employee employee = (Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
}
데이터베이스 구성
이제 만들자 hibernate.cfg.xml 데이터베이스 관련 매개 변수를 정의하기위한 구성 파일.
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name = "hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name = "hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- Assume students is the database name -->
<property name = "hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name = "hibernate.connection.username">
root
</property>
<property name = "hibernate.connection.password">
cohondob
</property>
</session-factory>
</hibernate-configuration>
컴파일 및 실행
위에서 언급 한 애플리케이션을 컴파일하고 실행하는 단계는 다음과 같습니다. 컴파일 및 실행을 계속하기 전에 PATH 및 CLASSPATH를 적절하게 설정했는지 확인하십시오.
경로에서 Employee.hbm.xml 매핑 파일을 삭제합니다.
위와 같이 Employee.java 소스 파일을 생성하고 컴파일합니다.
위와 같이 ManageEmployee.java 소스 파일을 생성하고 컴파일합니다.
ManageEmployee 바이너리를 실행하여 프로그램을 실행하십시오.
다음과 같은 결과를 얻고 EMPLOYEE 테이블에 레코드가 생성됩니다.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Zara Last Name: Ali Salary: 1000
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 10000
First Name: Zara Last Name: Ali Salary: 5000
First Name: John Last Name: Paul Salary: 10000
EMPLOYEE 테이블을 확인하면 다음과 같은 레코드가 있어야합니다.
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 29 | Zara | Ali | 5000 |
| 31 | John | Paul | 10000 |
+----+------------+-----------+--------+
2 rows in set (0.00 sec
mysql>