Hibernate¶
Hibernate — самая популярная реализация спецификации JPA, предназначенная для решения задач объектно-реляционного отображения (ORM).
Базовые определения¶
Object-Relational Mapping (ORM) позволяет проектировать работу с данными в терминах классов, а не таблиц данных и напротив, преобразовать термины и данные классов в данные, пригодные для хранения в СУБД. Так же обеспечивает интерфейс для CRUD операций.
Ссылки:
Data Access Object (DAO) — широко распространенный паттерн для сохранения объектов бизнес-области в базе данных. В самом широком смысле, DAO — это класс, содержащий CRUD методы для конкретной сущности.
public interface AccountDAO {
Account get(String userName);
void create(Account account);
void update(Account account);
void delete(String userName);
}
CRUD — акроним, обозначающий четыре базовые функции, используемые при работе с базами данных: create, read, update, delete.
Data Transfer Object (DTO) - один из шаблонов проектирования, используется для передачи данных между подсистемами приложения. DTO не содержит какого либо поведения.
В Enterprise JavaBeans (EJB): Entity Beans представляют объекты, находящиеся в постоянном хранилище, например, в базе данных. Минус такого подхода: так как DTO используется лишь как объект инкапсулирующий логику передачи/обновления/… состояния, то каждое изменение в entity bean может вызывать методы удалённого доступа, что увеличивает нагрузку на сеть и снижает скорость работы программы.
Persistence¶
Persistence относится к характеристике состояния, пережившего процесс, создавший его. Например, программы редактирования изображений или текстовые редакторы достигают персистентности, сохраняя свои документы в файлы.
Ссылки:
Persistence techniques¶
- System images
Образ системы представляет собой сериализованную копию всего состояния компьютерной системы, сохраненную в некоторой энергонезависимой форме, такой как файл
Orthogonal: Режим гибернации - не требует никаких действий от других программ для сохранения состояния и записывает всю используемую RAM память в постоянное хранилище.
Non-orthogonal: Программа редактирования текста, выполняющая конкретные инструкции для сохранения всего документа в файл.
- Journals
Ведение журнала - процесс сохранения событий в логе перед каждым изменением в системе. Такие логи называются журналами (Journals). Example: Undo/Redo.
- Dirty writes
Метод записи в хранилище только тех частей состояния системы, которые были изменены (загрязнены) с момента последней записи.
Например, сложные приложения для редактирования документов будут использовать грязные записи для сохранения только тех частей документа, которые были фактически изменены с момента последнего сохранения.
Orthogonal or transparent persistence
Среда с ортогональной персистентностью не требует каких-либо специальных действий от программ, работающих в ней, для извлечения или сохранения своего состояния. Orthogonal persistence is widely adopted in operating systems for hibernation and in platform virtualization systems such as VMware and VirtualBox for state saving.
Неортогональная персистентнось требует, чтобы данные записывались и читались в хранилище и из него с использованием специальных инструкций в программе (по завершении программа сохраняет данные).
JPA¶
Java Persistence API (JPA) — спецификация API Java EE, предоставляет возможность сохранять в удобном виде Java-объекты в базе данных. Это не единственный способ сохранения java объектов в базы данных (ORM систем), но один из самых популярных в Java мире.
Области, определяемые спецификацией JPA и обеспеивающие сохранность данных:
API, заданный в пакете
javax.persistenceJava Persistence Query Language
Метаинформация, описывающая связи между объектами
Генерация DDL для сущностей
Entity (Сущность, persistent domain object) — POJO-класс (но может так же содержать методы и реализовывать интерфейсы), связанный с БД с помощью аннотации @Entity или через XML.
К такому классу предъявляются требования, связанные с внутренними полями и определениями:
Должен иметь пустой конструктор (
publicилиprotected). Так же может содержать непустые конструкторы.Не может быть вложенным, интерфейсом или
enumНе может быть
finalи не может содержатьfinal-полей/свойствДолжен содержать хотя бы одно
@Id-поле
Entities могут быть связаны друг с другом (один-к-одному, один-ко-многим, многие-к-одному и многие-ко-многим).
Спецификация — это описание API, которое выражает данную концепцию. Спецификация рассказывает, какими средствами должны быть обеспечены (т.е. через какие интерфейсы можно работать), чтобы работать по концепции ORM. И как использовать эти средства. Реализацию средств спецификация не описывает.
Т.е. Воплощением ORM является спецификация JPA. А реализацией спецификации JPA является Hibernate.
JPA только описывает правила и API, а Hibernate реализует эти описания, впрочем у Hibernate (как и у многих других реализаций JPA) есть дополнительные возможности, не описанные в JPA (и не переносимые на другие реализации JPA).
JDO¶
JDO - одна из стандартных технологий (спецификаций) ORM на платформе JavaEE.
Java Data Objects is a specification of Java object persistence. One of its features is a transparency of the persistence services to the domain model.
JPA (Java Persistence API) и Java Data Objects (JDO) две спецификации сохранения java объектов в базах данных. Если JPA сконцентрирована только на реляционных базах, то JDO более общая спецификация которая описывает ORM для любых возможных баз и хранилищ. В принципе можно рассматривать JPA как специализированную на релятивистских баз часть спецификации JDO, даже при том что API этих двух спецификаций не полностью совпадает. Также отличаются «разработчики» спецификаций — если JPA разрабатывается как JSR, то JDO сначала разрабатывался как JSR, теперь разрабатывается как проект Apache JDO.