Учебники

Спящий режим — Аннотации

До сих пор вы видели, как Hibernate использует файл сопоставления XML для преобразования данных из POJO в таблицы базы данных и наоборот. Hibernate аннотации являются новейшим способом определения сопоставлений без использования файла XML. Вы можете использовать аннотации в дополнение или в качестве замены метаданных отображения XML.

Аннотации в спящем режиме — это мощный способ предоставления метаданных для отображения объектов и реляционных таблиц. Все метаданные объединяются в Java-файл POJO вместе с кодом, это помогает пользователю одновременно понимать структуру таблицы и POJO во время разработки.

Если вы собираетесь сделать свое приложение переносимым на другие совместимые с EJB 3 приложения ORM, вы должны использовать аннотации для представления информации о сопоставлении, но, тем не менее, если вы хотите большей гибкости, вам следует использовать сопоставления на основе XML.

Настройка среды для спящего аннотации

Прежде всего вам необходимо убедиться, что вы используете JDK 5.0, в противном случае вам нужно обновить JDK до JDK 5.0, чтобы воспользоваться встроенной поддержкой аннотаций.

Во-вторых, вам нужно установить дистрибутив аннотаций Hibernate 3.x, доступный из sourceforge: ( Скачать аннотацию Hibernate ), и скопировать hibernate-annotations.jar, lib / hibernate-comons-annotations.jar и lib / ejb3-persistence. jar из дистрибутива Hibernate Annotations для вашего CLASSPATH.

Пример аннотированного класса

Как я упоминал выше при работе с Hibernate Annotation, все метаданные объединяются в Java-файл POJO вместе с кодом, это помогает пользователю одновременно понимать структуру таблицы и 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 находится в поле, и предполагает, что он должен обращаться к свойствам объекта напрямую через поля во время выполнения. Если вы поместите аннотацию @Id в метод getId (), вы по умолчанию разрешите доступ к свойствам через методы getter и setter. Следовательно, все остальные аннотации также размещаются в полях или методах получения в соответствии с выбранной стратегией.

Следующий раздел объяснит аннотации, используемые в вышеприведенном классе.

@Entity Annotation

Стандартные аннотации EJB 3 содержатся в пакете javax.persistence , поэтому мы импортируем этот пакет в качестве первого шага. Во-вторых, мы использовали аннотацию @Entity для класса Employee, который помечает этот класс как объектный компонент, поэтому он должен иметь конструктор без аргументов, видимый как минимум с защищенной областью действия.

@Table Annotation

Аннотация @Table позволяет вам указать детали таблицы, которая будет использоваться для сохранения сущности в базе данных.

Аннотация @Table предоставляет четыре атрибута, позволяющих переопределить имя таблицы, ее каталог и ее схему, а также применить уникальные ограничения для столбцов в таблице. На данный момент мы используем только имя таблицы, которая является EMPLOYEE.

Аннотации @Id и @GeneratedValue

Каждый объектный компонент будет иметь первичный ключ, который вы аннотируете в классе с помощью аннотации @Id . Первичный ключ может быть одним полем или комбинацией нескольких полей в зависимости от структуры таблицы.

По умолчанию аннотация @Id автоматически определяет наиболее подходящую стратегию генерации первичного ключа, но вы можете переопределить ее, применив аннотацию @GeneratedValue , которая использует стратегию с двумя параметрами и генератор, которые я не буду обсуждать здесь, поэтому давайте использовать только стратегию генерации ключей по умолчанию. Разрешение Hibernate определять, какой тип генератора использовать, делает ваш код переносимым между различными базами данных.

@ Колонка Аннотация

Аннотация @Column используется для указания сведений о столбце, в который будет отображаться поле или свойство. Вы можете использовать аннотацию столбца со следующими наиболее часто используемыми атрибутами:

  • Атрибут name позволяет явно указать имя столбца.

  • Атрибут length разрешает размер столбца, используемого для сопоставления значения, особенно для значения String.

  • Атрибут nullable позволяет пометить столбец NOT NULL при создании схемы.

  • Атрибут unique позволяет пометить столбец как содержащий только уникальные значения.

Атрибут name позволяет явно указать имя столбца.

Атрибут length разрешает размер столбца, используемого для сопоставления значения, особенно для значения String.

Атрибут 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.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, она должна иметь следующие записи: