суббота, 9 марта 2013 г.

Java Persistence API. Часть вторая.

В данной статье мы рассмотрим с вами, как настроить соединения с базой данных при помощи persistence.xml файла, рассмотрим пример DAO класса - класса, который непосредственно управляет объектами в базе данных.


Persistence.xml 

Для начала нам необходимо создать файл persistence.xml и закинуть его в папку META_INF проекта. В файле persistence.xml указываем persistence-unit name, имя которое мы придумываем для последующего вызова унита. И создаем все необходимые конфигурации в тегах . Этот файл будет иметь примерно следующее содержание:



    
        org.hibernate.ejb.HibernatePersistence
         
            
            
            
            
            
            
            
        
    


EntityManager 

Для связи с базой данных вам будет необходим entity manager. Потому создаем примерно следующий класс со статическим доступом к entityManager. В качестве аргумента к методу createEntityManagerFactory используем имя нашего persistence-unit.

public final class ServiceLocator {

    private static EntityManager entityManager;

    public ServiceLocator() {

        EntityManagerFactory factory;
        factory = Persistence.createEntityManagerFactory("Example");
        entityManager = factory.createEntityManager();

    }

    public static EntityManager getEntityManager() {
        return entityManager;
    }

}

Классы Dao.

Теперь непосредственно класс, который будет управлять объектами в базе данных. Для пример возьмем два метода. Метод addTeacher добавляет объект Teacher в базу данных, а метод getTeacher возвращает объект Teacher из базы данных, руководствуясь именем и почтой Teacher, которого подали в аргументе. Если же такого в базе данных не находится, то создаем нового Teacher и возвращаем его.

public class TeacherDao {


    private EntityManager entityManager;

    public TeacherDao(final EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public final Teacher getTeacher(final Teacher teacherToFind) {
        Teacher teacher;
        List teacherList;
        try {
            Query query = entityManager.createNamedQuery(Teacher.GET_TEACHER_BY_NAME_AND_EMAIL);
            query.setParameter("name", teacherToFind.getName());
            query.setParameter("branchId", teacherToFind.getEmail());
            teacherList = query.getResultList();
            if (teacherList.isEmpty()) {
                addTeacher(teacherToFind);
                teacher = teacherToFind;
            } else {
                teacher = teacherList.get(0);
            }

        } catch (final Throwable throwable) {
            if (entityManager.getTransaction().isActive()) {
                entityManager.getTransaction().rollback();
            }
            throw new RuntimeException(throwable);
        }
        return teacher;
    }

    public final void addTeacher(final Teacher teacher) {
        try {
            entityManager.getTransaction().begin();
            entityManager.persist(teacher);
            entityManager.getTransaction().commit();
        } catch (final Throwable throwable) {
            if (entityManager.getTransaction().isActive()) {
                entityManager.getTransaction().rollback();
            }
            throw new RuntimeException(throwable);
        }

    }

}

Пример кода 

И, наконец, пример того, как можно это все использовать в коде.

new ServiceLocator;
EntityManager entityManager = ServiceLocator.getEntityManager();
TeacherDao teacherDao = new TeacherDao(entityManager);
Teacher teacher = new Teacher;
teacher.setName("Mary");
teacher.setEmail("mary@test.com");
Teacher teacherFromDatabase = teacherDao.getTeacher(teacher);

Автор статьи: Александр Картышев

Комментариев нет:

Отправить комментарий