Gostaria de saber por que não criamos um DAO genérico em vez de criar um para cada entidade e se dentro do DAO no método cadstrar já podemos iniciar a transação persistir e comitar em vez de deixar isso para a classe principal, nela ficaria só o closed.
public class Dao {
private EntityManager em;
public Dao(EntityManager em) {
    this.em = em;
}
public void cadastrar(Object obj) {
    em.getTransaction().begin();
    em.persist(obj);
    em.getTransaction().commit();
}}
public class CadastroDeProduto {
public static void main(String[] args) {
    EntityManager em = JPAUtil.getEntityManager();
    Dao dao = new Dao(em);
    Categoria cat1 = new Categoria("teste");
    dao.cadastrar(cat1);
    Produto prod1 = new Produto();
    prod1.setNome("Caneta Bic");
    prod1.setDescricao("Caneta azul");
    prod1.setPreco(new BigDecimal("800"));
    prod1.setCategora(cat1);
    dao.cadastrar(prod1);
    em.close();
}}