• Аннотация @GeneratedValue проинформирует поставщика постоянства о необходимости автоматического генерирования первичного ключа с использованием инструмента id основной базы данных.
package org.agoncal.book.javaee7.chapter04;
@Entity
@NamedQueries({
··@NamedQuery(name = "findAllBooks", query = "SELECT b FROM Book b"),
··@NamedQuery(name = "findBookH2G2", query = "SELECT b FROM Book b
WHERE b.title ='H2G2'")
})
public class Book {
··@Id @GeneratedValue
··private Long id;
··@NotNull
··private String title;
··private Float price;
··@Size(min = 10, max = 2000)
··private String description;
··private String isbn;
··private Integer nbOfPage;
··private Boolean illustrations;
··// Конструкторы, геттеры, сеттеры
}
Обратите внимание, что для лучшей удобочитаемости я убрал конструктор, геттеры и сеттеры этого класса. Как видно из кода, если не считать нескольких аннотаций, Book представляет собой простой POJO. А теперь напишем класс Main, который будет обеспечивать постоянство Book в базе данных.
Написание класса Main
Класс Main, показанный в листинге 4.8, будет располагаться в том же пакете, что и сущность Book. Он начнет с того, что создаст новый экземпляр Book (с использованием ключевого слова Java new) и задаст значения для его атрибутов. Здесь не будет ничего особенного, лишь чистый Java-код. Затем он воспользуется классом Persistence для получения экземпляра EntityManagerFactory, ссылающегося на единицу сохраняемости с именем chapter04PU, которую я охарактеризую позднее, в разделе «Написание единицы сохраняемости». EntityManagerFactory создаст экземпляр EntityManager (переменная em). Как уже отмечалось ранее, EntityManager является центральным элементом JPA в том смысле, что способен начать транзакцию, обеспечить постоянство объекта Book с помощью метода EntityManager.persist(), а затем произвести фиксацию транзакции. В конце метода main() как EntityManager, так и EntityManagerFactory будут закрыты, чтобы высвободить ресурсы поставщика.
package org.agoncal.book.javaee7.chapter04;
public class Main {
··public static void main(String[] args) {
····// Создает экземпляр Book
····Book book = new Book("H2G2", "Автостопом по Галактике",
····12.5F, "1-84023-742-2", 354, false);
····// Получает EntityManager и транзакцию
····EntityManagerFactory emf =
Persistence.createEntityManagerFactory("chapter04PU");
····EntityManager em = emf.createEntityManager();
····// Обеспечивает постоянство Book в базе данных
····EntityTransaction tx = em.getTransaction();
····tx.begin();
····em.persist(book);
····tx.commit();
····// Закрывает EntityManager и EntityManagerFactory
····em.close();
····emf.close();
··}
}
Опять-таки ради удобочитаемости я убрал обработку исключений. Если будет иметь место исключение постоянства, то вам придется откатить транзакцию, зарегистрировать сообщение и закрыть EntityManager в финальном блоке.
Написание интеграционного теста BookIT