Generic DAO com TopLink

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 ?

Tente aqui PersistenceContext e aqui UserTransaction