Vamos lá Eric,
A transação deve ser controlada pela camada de serviço e NUNCA dentro do DAO, portanto, você deve fazer o controle da transação dentro da sua classe TesteAmigo.java. Porém existe um agravante ai: O SessionFactory está sendo iniciado dentro do DAO.
Eu sei que isso é apenas um teste, mas já é bom ir se acostumando com boas práticas. No caso do SessionFactory, ele é um objeto “custoso” para ser criado, assim sendo, ele deve ser criado apenas 1 vez na aplicação. No site do hibernate tem o exemplo de um HibernateUtils.java, onde o SessionFactory é criado e compartilhado com toda a aplicação http://www.hibernate.org/42.html#A11
Como você pôde perceber no seu código, o seu SessionFactory está sendo criado apenas para o AmigoDAO.java. Portanto a primeira coisa a fazer é externalizar do AmigoDAO a criação do SessionFactory. Supondo que você esteja usando o HibernateUtils, você poderia criar o objeto Session (esse não é custoso) dentro AmigoDAO assim:
Session session = HibernateUtil .getSessionFactory().openSession();
e depois a utlização dos métodos save(), load(), find(), delete(), etc… poderia ser feita assim:
session.save(objeto);
session.flush();
session.close();
Dentro da sua camada de serviço (no seu caso AmigoTeste.java), você poderia envolver uma transação no meio da operação dos DAOs, exemplo:
public class TesteAmigo {
public static void main(String[] args) throws Exception {
try{
Amigo amigo = new Amigo();
amigo.setNome("seu nome");
amigo.setEndereco("seu endereco");
amigo.setTelefone("seu fone");
amigo.setCelular("seu celular");
amigo.setEmail("seu mail");
//amigo.setNascimento("10/10/1987");
AmigoDAO dao = new AmigoDAO();
HibernateUtil.getSessionFactory().openSession().beginTransaction().begin(); //inicia a transação
dao.insert(amigo);
HibernateUtil.getSessionFactory().openSession().beginTransaction().commit(); //commit
System.out.println("asd");
}catch(Exception e){
e.printStackTrace();
}
}
}
Teoricamente com essas mudanças você vai conseguir persistir o objeto, porém note que isso foi apenas um exemplo. Em uma aplicação real, você deve tratar o commit ou rollback (se ocorrer alguma exception, como por exemplo, HibernateException).
Novamente eu digo: estude bem a documentação do Hibernate, ela é bem completa e vai te dar todas as informações que você precisa. Quando tiver dúvida, procure na internet boas práticas para se trabalhar com Hibernate. No final das contas, você vai ver como o Hibernate é fantástico e a mão na roda que ele é em aplicações de médio/grande porte.
Espero ter ajudado