Problema com JPA

opa, eu to tentando fazer um exemplo simples usando jpa, mas não tô conseguindo rodar o programa… já refiz a app várias vezes e nunca dah certo…
to usando mysql, toplink;

se alguém tiver alguma dica será bem vinda

aí vai o código:

// essa é a classe Client q vai persistir 2 objetos no banco

package bar.client;

import bar.model.Sushi;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		BaseDao<Sushi> dao = new BaseDao<Sushi>();
		
		Sushi hot = new Sushi();
		hot.setName("Hot Filadelfia");
		
		Sushi fil = new Sushi();
		fil.setName("Filadelfia");
		
		dao.create(hot);
		dao.create(fil);	
	}
}

// essa é a classe BaseDao q vai executar a persistẽncia

package bar.client;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class BaseDao<T> {

	private static EntityManagerFactory emf;
	private EntityManager em;
	
	public BaseDao() {
		emf = Persistence.createEntityManagerFactory("pu1");
		em = emf.createEntityManager();	
	}
	
	public boolean create(T obj) {
		em.getTransaction().begin();
		try {
			em.persist(obj);
			em.getTransaction().commit();
			return true;
		}
		catch(Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
			return false;
		}
	}
}

//Essa é a de persistência Sushi

package bar.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Sushi {

	@Id
	@Column(insertable = false)
	private int id;
	
	private String name;
	
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

// esse é o arquivo de persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
	version="1.0">
	<persistence-unit name="pu1">
		<provider>
			oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider
		</provider>
		<class>bar.model.Sushi</class>
		<properties>
			<property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="toplink.jdbc.url" value="jdbc:mysql://3306/sushibardb" />
			<property name="toplink.jdbc.user" value="root" />
			<property name="toplink.jdbc.password" value="tricolor" />
			<property name="toplink.logging.level" value="INFO" />
		</properties>
	</persistence-unit>
</persistence>

// esse é o erro:
[TopLink Info]: 2009.07.05 08:46:46.522–ServerSession(2730814)–TopLink, version: Oracle TopLink Essentials - 2.0 (Build b41-beta2 (03/30/2007))
Exception in thread “main” Local Exception Stack:
Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0 (Build b41-beta2 (03/30/2007))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

java.net.SocketException
MESSAGE: java.net.NoRouteToHostException: No route to host: connect

STACKTRACE:

java.net.SocketException: java.net.NoRouteToHostException: No route to host: connect
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:156)
at com.mysql.jdbc.MysqlIO.(MysqlIO.java:276)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2666)
at com.mysql.jdbc.Connection.(Connection.java:1531)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:154)
at oracle.toplink.essentials.sessions.DefaultConnector.connect(DefaultConnector.java:85)
at oracle.toplink.essentials.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:170)
at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:537)
at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:206)
at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:212)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:78)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:111)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:105)
at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:76)
at bar.client.BaseDao.(BaseDao.java:13)
at bar.client.Client.main(Client.java:12)

Bom dia!

No seu arquivo persistence.xml tem uma linha que está errada:

<property name="toplink.jdbc.url" value="jdbc:mysql://3306/sushibardb" />

Você não está colocando a URL do banco de dados corretamente…

<property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/sushibardb" />

Valeu!

putz… q vacilo … valeu mesmo…

brigadão!!!

opa, eu de novo… o programa tá funcionando agora, porém só consigo persistir o primeiro objeto. ao tentar persistir o segundo dá erro…
…eu acho q eh pq o programa tá tentando inserir um ID repetido… mas não to entendendo…
eu coloquei a anotation @Column(insertable = false) no atributo ID e o ID no banco é autoIncremento… então o programa não deveria persistir o atributo ID… o valor dele seria gerado automaticamente pelo banco…

ou eu estou errado?

erro:
[TopLink Info]: 2009.07.06 09:45:59.556–ServerSession(2730814)–TopLink, version: Oracle TopLink Essentials - 2.0 (Build b41-beta2 (03/30/2007))
[TopLink Info]: 2009.07.06 09:46:00.808–ServerSession(2730814)–file:/C:/workspace/Sushibar/bin/-pu1 login successful
javax.persistence.EntityExistsException:
Exception Description: Cannot persist detached object [bar.model.Sushi@1d0d124].
Class> bar.model.Sushi Primary Key> [0]
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:193)
at bar.client.BaseDao.create(BaseDao.java:19)
at bar.client.Client.main(Client.java:20)
Caused by: Exception [TOPLINK-7231] (Oracle TopLink Essentials - 2.0 (Build b41-beta2 (03/30/2007))): oracle.toplink.essentials.exceptions.ValidationException
Exception Description: Cannot persist detached object [bar.model.Sushi@1d0d124].
Class> bar.model.Sushi Primary Key> [0]
at oracle.toplink.essentials.exceptions.ValidationException.cannotPersistExistingObject(ValidationException.java:2156)
at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNotRegisteredNewObjectForPersist(UnitOfWorkImpl.java:3237)
at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.registerNotRegisteredNewObjectForPersist(RepeatableWriteUnitOfWork.java:323)
at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:3206)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:190)
… 2 more
… 10 more

No Atributo id de sua classe Sushi colaca

@Id
@GeneratedValue // Gera o id automático pelo sequence do hibernate
@Column(insert=false)
private int id;

pessoal… o problema desse exemplo tava no código da classe BaseDao…
como a classe Client só instanciava um objeto da classe BaseDao para persistir 2 objetos… o segundo objeto nunca era persistido pois o em e emf tavam em uso…
acontece que o construtor da classe BaseDao inicializava tanto em quanto emf e não liberava os recursos…
a resolução que encontrei foi tirar o construtor da classe e inicializar e liberar os objetos de persistencia no método create…

… como esse exemplo tá no site da devmedia… pode ser q esse post seja util pra quem tah querendo aprender JPA …

o codigo de resolução ficou assim:

package bar.client;  
   
import javax.persistence.EntityManager;  
import javax.persistence.EntityManagerFactory;  
import javax.persistence.Persistence;  
   
public class BaseDao<T> {  
   
     private static EntityManagerFactory emf;  
     private EntityManager em;  
       
     public boolean create(T obj) {  
	emf = Persistence.createEntityManagerFactory("pu1");  
         em = emf.createEntityManager();  
         em.getTransaction().begin();  
         try {  
             em.persist(obj);  
             em.getTransaction().commit();  
             return true;  
         }  
         catch(Exception e) {  
             e.printStackTrace();  
             em.getTransaction().rollback();  
             return false;  
         } 
	 finally {
		 em.close();
		 emf.close();
	 }
     }  
 }