Hi, eu estou tentando migrar a minha aplicação para usar JPA com TopLink e tenho algumas duvidas como usar os conceitos do Generic DAO com TopLink. Segue abaixo o codigo:
//Interface Generica
public interface GenericDAO<T> {
public void makePersistent(T entity);
public void makeTransient(T entity);
}
//DAO generico para o TopLink
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@PersistenceContext(name = "persistence/LogicalName", unitName = "tedevoumaPU")
public class GenericToplinkDAO <T, DAOImpl extends GenericDAO> implements GenericDAO<T>{
private EntityManager em;
public DAOImpl setEntityManager(EntityManager em){
this.em = em;
return (DAOImpl) this;
}
public void makePersistent(T entity){
em.persist(entity);
}
public void makeTransient(T entity){
em.remove(entity);
}
}
//A interface do meu DAO
public interface CompanyDAO<T> extends GenericDAO<Company>{
}
//A implementação do DAO para o TopLink
public class ToplinkCompanyDAO extends GenericToplinkDAO<Company, CompanyDAO> implements CompanyDAO<Company>{
}
Agora vem a parte que me complicou um pouco, que é a fabrica
public abstract class DAOFactory {
public abstract CompanyDAO getCompanyDAO();
public static DAOFactory getDAOFactory(){
Properties resource = Util.readResource();
int whichRepository = Integer.parseInt(resource.getProperty("whichRepository"));
switch(whichRepository){
case 1:
return new ToplinkDAOFactory();
default:
return null;
}
}
}
//Minha implementação da fabrica para o TopLink
import javax.naming.Context;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import easymobile.model.persistence.dao.CompanyDAO;
import easymobile.model.persistence.dao.ToplinkCompanyDAO;
@PersistenceContext(name = "persistence/LogicalName", unitName = "tedevoumaPU")
public class ToplinkDAOFactory extends DAOFactory{
private static final Context ctx;
static {
try {
ctx = (Context) new javax.naming.InitialContext().lookup("java:comp/env");
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
private static EntityManager getEntityManager() {
try{
return (EntityManager) ctx.lookup("persistence/LogicalName");
}catch(NamingException ex){
throw new RuntimeException(ex);
}
}
public CompanyDAO getCompanyDAO() throws RuntimeException{
return new ToplinkCompanyDAO().setEntityManager( getEntityManager() );
}
}
Meu servlet ou qualquer coisa do genero
import javax.annotation.Resource;
import javax.persistence.PersistenceContext;
import easymobile.model.persistence.DAOFactory;
import easymobile.model.persistence.dao.CompanyDAO;
import easymobile.model.persistence.entity.Company;
@PersistenceContext(name = "persistence/LogicalName", unitName = "tedevoumaPU")
public class Teste {
private final DAOFactory factory;
@Resource
private javax.transaction.UserTransaction utx;
public SecurityManager(){
factory = DAOFactory.getDAOFactory();
}
public void teste(){
Company company = new Company();
company.setPkCompany(1l);
company.setName("easymobile");
CompanyDAO companyDAO = factory.getCompanyDAO();
try {
utx.begin();
companyDAO.makePersistent(company);
utx.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Eu migrei agora para o netbeans e estou usando alguns de seus recursos, e um dos recursos que estou usando são os wizards para persistencia.
Eu tenho algumas duvidas sobre o que é essas anotações:
@PersistenceContext(name = “persistence/LogicalName”, unitName = “tedevoumaPU”)
public class Teste…
@Resource
private javax.transaction.UserTransaction utx;
Alguem tem feito algo do genero ? pode fazer algum comentário ?