com.seavus.library.db.HLibDB.java Source code

Java tutorial

Introduction

Here is the source code for com.seavus.library.db.HLibDB.java

Source

package com.seavus.library.db;

import com.seavus.library.db.entity.Loan;
import com.seavus.library.db.entity.Book;
import com.seavus.library.db.entity.Magazine;
import com.seavus.library.db.entity.Membership;
import com.seavus.library.db.entity.Publication;
import com.seavus.library.db.entity.Member;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author George
 */
public class HLibDB implements LibDAO {

    private HLibDB() {
    }

    private static class Singleton {
        private static final HLibDB INSTANCE = new HLibDB();
    }

    public static HLibDB getInstance() {
        return Singleton.INSTANCE;
    }

    private Configuration configuration;
    private ServiceRegistry serviceRegistry;
    private SessionFactory sessionFactory;
    private HibernateTemplate hibernateTemplate;

    @Override
    public void connect() {
        configuration = new Configuration();
        serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        configuration.addAnnotatedClass(Book.class);
        configuration.addAnnotatedClass(Magazine.class);
        configuration.addAnnotatedClass(Publication.class);
        configuration.addAnnotatedClass(Member.class);
        configuration.addAnnotatedClass(Membership.class);
        configuration.addAnnotatedClass(Loan.class);
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        hibernateTemplate = new HibernateTemplate(sessionFactory);
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Publication> listPublications(final String publicationType) {
        return (List<Publication>) hibernateTemplate.read(new ReadCallback() {
            @Override
            public Object read(Session session) {
                Query query = session.createQuery("FROM " + publicationType);
                return query.list();
            }
        });
    }

    @Override
    public List<Member> listMembers() {
        return (List<Member>) hibernateTemplate.read(new ReadCallback() {
            @Override
            public Object read(Session session) {
                return session.createQuery("FROM LibraryMember").list();
            }
        });
    }

    @Override
    @SuppressWarnings("unchecked")
    public Publication getPublication(final long id) {
        return (Publication) hibernateTemplate.read(new ReadCallback() {
            @Override
            public Object read(Session session) {
                Query query = session.createQuery("FROM Publication P WHERE P.id = :P_ID");
                query.setParameter("P_ID", id);
                Object pbl = null;
                if (!query.list().isEmpty())
                    pbl = query.list().get(0);
                return pbl;
            }
        });
    }

    @Override
    @SuppressWarnings("unchecked")
    public Member getMember(final long id) {
        return (Member) hibernateTemplate.read(new ReadCallback() {
            @Override
            public Object read(Session session) {
                Query query = session.createQuery("FROM LibraryMember M WHERE M.id = :M_ID");
                query.setParameter("M_ID", id);
                Object pbl = null;
                if (!query.list().isEmpty())
                    pbl = query.list().get(0);
                return pbl;
            }
        });
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Publication> getPublicationByTitle(final String title) {
        return (List<Publication>) hibernateTemplate.read(new ReadCallback() {
            @Override
            public Object read(Session session) {
                Query query = session.createQuery("FROM Publication P WHERE LOWER(P.title) LIKE :P_TITLE");
                query.setParameter("P_TITLE", "%" + title.toLowerCase() + "%");
                return query.list();
            }
        });
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Member> getMemberByName(final String firstName, final String lastName) {
        return (List<Member>) hibernateTemplate.read(new ReadCallback() {
            @Override
            public Object read(Session session) {
                Query query = session.createQuery(
                        "FROM LibraryMember M WHERE LOWER(M.firstName) LIKE :F_NAME AND LOWER(M.lastName) LIKE :L_NAME");
                query.setParameter("F_NAME", "%" + firstName.toLowerCase() + "%");
                query.setParameter("L_NAME", "%" + lastName.toLowerCase() + "%");
                return query.list();
            }
        });
    }

    @Override
    public Loan getOpenLoan(final Publication pbl, final Member mbr) {
        return (Loan) hibernateTemplate.read(new ReadCallback() {
            @Override
            public Object read(Session session) {
                Query query = session
                        .createQuery("FROM Loan WHERE p_id = :P_ID AND m_id = :M_ID AND enddate IS NULL");
                query.setParameter("P_ID", pbl.getId());
                query.setParameter("M_ID", mbr.getId());
                Object openLoan = null;
                if (!query.list().isEmpty())
                    openLoan = query.list().get(0);
                return openLoan;
            }
        });
    }

    @Override
    public void insertBook(final String isbn, final String title) {
        hibernateTemplate.execute(new ExecuteCallback() {
            @Override
            public void execute(Session session) {
                Book book = new Book();
                book.setIsbn(isbn);
                book.setTitle(title);
                session.save(book);
            }
        });
    }

    @Override
    public void insertMagazine(final String issn, final String title) {
        hibernateTemplate.execute(new ExecuteCallback() {
            @Override
            public void execute(Session session) {
                Magazine magazine = new Magazine();
                magazine.setIssn(issn);
                magazine.setTitle(title);
                session.save(magazine);
            }
        });
    }

    @Override
    public void insertMember(final String firstName, final String lastName, final String eMail) {
        hibernateTemplate.execute(new ExecuteCallback() {
            @Override
            public void execute(Session session) {
                Member member = new Member();
                member.setFirstName(firstName);
                member.setLastName(lastName);
                member.setEmail(eMail);
                Timestamp now = new Timestamp(Calendar.getInstance().getTime().getTime());
                member.setMembership(new Membership("Standard", now));
                session.save(member);
            }
        });
    }

    @Override
    public void insertLoan(final Publication publication, final Member member) {
        hibernateTemplate.execute(new ExecuteCallback() {
            @Override
            public void execute(Session session) {
                Loan loan = new Loan(publication, member);
                loan.setStartDate(new Timestamp(Calendar.getInstance().getTime().getTime()));
                session.save(loan);
            }
        });
    }

    @Override
    public int updatePublication(final Publication publication) {
        return (int) hibernateTemplate.read(new ReadCallback() {
            @Override
            public Object read(Session session) {
                Query query;
                if (publication instanceof Book) {
                    query = session.createQuery("UPDATE Book set isbn = :isbn, title = :title WHERE id = :p_id");
                    query.setParameter("isbn", ((Book) publication).getIsbn());
                } else {
                    query = session
                            .createQuery("UPDATE Magazine set issn = :issn, title = :title WHERE id = :p_id");
                    query.setParameter("issn", ((Magazine) publication).getIssn());
                }
                query.setParameter("p_id", publication.getId());
                query.setParameter("title", publication.getTitle());
                return query.executeUpdate();
            }
        });
    }

    @Override
    public int updateMember(final Member member) {
        return (int) hibernateTemplate.read(new ReadCallback() {
            @Override
            public Object read(Session session) {
                Query query;
                query = session.createQuery(
                        "UPDATE LibraryMember set firstName = :f_name, lastName = :l_name, eMail = :email WHERE id = :m_id");
                query.setParameter("f_name", member.getFirstName());
                query.setParameter("l_name", member.getLastName());
                query.setParameter("email", member.getEmail());
                query.setParameter("m_id", member.getId());
                return query.executeUpdate();
            }
        });
    }

    @Override
    public void updateMembership(final Member member) {
        hibernateTemplate.execute(new ExecuteCallback() {
            @Override
            public void execute(Session session) {
                Query query;
                query = session.createQuery(
                        "UPDATE Membership set membershipType = :membership, endDate = :endDate WHERE id = :m_id");
                query.setParameter("m_id", member.getId());
                query.setParameter("membership", member.getMembership().getMembershipType());
                query.setParameter("endDate", member.getMembership().getEndDate());
                query.executeUpdate();
            }
        });
    }

    @Override
    public void updateLoan(final Loan loan) {
        hibernateTemplate.execute(new ExecuteCallback() {
            @Override
            public void execute(Session session) {
                Query query;
                query = session.createQuery("UPDATE Loan SET endDate = :endDate WHERE id = :l_id");
                query.setParameter("l_id", loan.getId());
                query.setParameter("endDate", loan.getEndDate());
                query.executeUpdate();
            }
        });
    }

    @Override
    public int deletePublication(final long id) {
        return (int) hibernateTemplate.read(new ReadCallback() {
            @Override
            public Object read(Session session) {
                Query query = session.createQuery("DELETE FROM Publication WHERE id = :p_id");
                query.setParameter("p_id", id);
                return query.executeUpdate();
            }
        });
    }

    @Override
    public void deleteMember(final long id) {
        hibernateTemplate.execute(new ExecuteCallback() {
            @Override
            public void execute(Session session) {
                Query q = session.createQuery("FROM LibraryMember where id = :id ");
                q.setParameter("id", id);
                Member stock = (Member) q.list().get(0);
                session.delete(stock);
            }
        });
    }

}