JPAOwnerDAO.java

package ejava.examples.ejbsessionbank.jpa;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ejava.examples.ejbsessionbank.bo.Account;
import ejava.examples.ejbsessionbank.bo.Owner;
import ejava.examples.ejbsessionbank.dao.DAOException;
import ejava.examples.ejbsessionbank.dao.OwnerDAO;

public class JPAOwnerDAO implements OwnerDAO {
    static final Logger log = LoggerFactory.getLogger(JPAOwnerDAO.class);
    
    static final String COUNT_ACCOUNT_REFERENCES_QUERY = 
        "countAccountReferences";
    
    private EntityManager em;

    public void setEntityManager(EntityManager em) {
        this.em = em;
    }

    public Owner createOwner(Owner owner) throws DAOException {
        em.persist(owner);
        return owner;
    }

    @SuppressWarnings("unchecked")
    public List<Owner> findOwners(String queryName, Map<String, Object> params,
            int index, int count) throws DAOException {
        Query query = em.createNamedQuery(queryName);
        if (params != null && params.size() > 0) {
            for (String key : params.keySet()) {
                Object value = params.get(key);
                query.setParameter(key, value);
            }
        }
        return query.setFirstResult(index)
                     .setMaxResults(count)
                     .getResultList();
    }

    public Owner getOwnerById(long id) throws DAOException {
        return em.find(Owner.class, id);
    }

    public Owner removeOwner(Owner owner) throws DAOException {
        if (!em.contains(owner)) {
            owner = em.find(Owner.class, owner.getId());
        }
        if (owner != null) {
            Collection<Account> accounts = new ArrayList<Account>();
            accounts.addAll(owner.getAccounts());
            for (Account a: accounts) {
                owner.getAccounts().remove(a);
    
                //don't delete account if referenced by other owners
                if (((Long)em.createNamedQuery(COUNT_ACCOUNT_REFERENCES_QUERY)
                      .setParameter("account", a)
                      .getSingleResult()) == 0) {
                    em.remove(a);
                }
            }
            em.remove(owner);
        }
        return owner;
    }

	public List<Owner> getAccountOwners(Account account) throws DAOException {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("account", account);
        List<Owner> owners = 
        	findOwners("getAccountOwner", params, 0, 100);
        return owners;
	}
}