Sei que já ouve varias discussões sobre este aspecto mas nenhuma me ajudou. Não estou conseguindo gerar minhas tabelas pelo hibernate.
Segue o código:
Banco de Dados e a criação da tabela:
[code]package BancoDeDados;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = “Biologia”)
public class BancoBio {
@Id
@Column(name = “id”)
Integer id;
public BancoBio() {
super();
}
public BancoBio(Integer id) {
super();
this.id = id;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
BancoBio other = (BancoBio) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@Override
public String toString() {
return "BancoBio [id=" + id + "]";
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
[/code]
Componente Main com acesso ao banco (básico):
[code]package Main;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import BancoDeDados.BancoBio;
public class MainBD {
public static void main(String[] args) {
//Obtém a fabrica de gerenciadores de persistência
EntityManagerFactory emf = Persistence.createEntityManagerFactory(“Vestibular”);
//Obtém o gerenciador de persistência
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
BancoBio questao = new BancoBio();
questao.setId(2);
em.merge(questao);
em.getTransaction().commit();
}
}
[/code]
Persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="Vestibular" transaction-type="RESOURCE_LOCAL">
<class>BancoDeDados.BancoBio</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/Vestibular"/>
<property name="javax.persistence.jdbc.user" value="postgres"/>
<property name="javax.persistence.jdbc.password" value="postgres"/>
<property name="generateDdl" value="true" /> <!--Também já botei: <property name="hibernate.hbm2ddl.auto" value="create/update/create-drop"/> Ps: nehuma funcionou -->
</properties>
</persistence-unit>
</persistence>
Erro:
[EL Info]: 2013-09-11 18:46:47.138--ServerSession(1844350239)--EclipseLink, version: Eclipse Persistence Services - 2.5.0.v20130507-3faac2b
[EL Info]: connection: 2013-09-11 18:46:47.612--ServerSession(1844350239)--file:/C:/Workspace/Vestibular/build/classes/_Vestibular login successful
[EL Warning]: 2013-09-11 18:46:47.782--UnitOfWork(2048752498)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERRO: relação "biologia" não existe
Posição: 16
Error Code: 0
Call: SELECT id FROM Biologia WHERE (id = ?)
bind => [1 parameter bound]
Query: ReadObjectQuery(referenceClass=BancoBio )
Exception in thread "main" Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERRO: relação "biologia" não existe
Posição: 16
Error Code: 0
Call: SELECT id FROM Biologia WHERE (id = ?)
bind => [1 parameter bound]
Query: ReadObjectQuery(referenceClass=BancoBio )
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:679)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:558)
at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1995)
at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:570)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectOneRow(DatasourceCallQueryMechanism.java:714)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectOneRowFromTable(ExpressionQueryMechanism.java:2777)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectOneRow(ExpressionQueryMechanism.java:2730)
at org.eclipse.persistence.queries.ReadObjectQuery.executeObjectLevelReadQuery(ReadObjectQuery.java:526)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1155)
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1114)
at org.eclipse.persistence.queries.ReadObjectQuery.execute(ReadObjectQuery.java:429)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1202)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2894)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1797)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1779)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1730)
at org.eclipse.persistence.internal.sessions.AbstractSession.readObject(AbstractSession.java:3656)
at org.eclipse.persistence.internal.sessions.MergeManager.registerObjectForMergeCloneIntoWorkingCopy(MergeManager.java:1093)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfCloneIntoWorkingCopy(MergeManager.java:557)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:313)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3524)
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.mergeCloneWithReferences(RepeatableWriteUnitOfWork.java:384)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3484)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.mergeInternal(EntityManagerImpl.java:542)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.merge(EntityManagerImpl.java:519)
at Main.MainBD.main(MainBD.java:18)
Caused by: org.postgresql.util.PSQLException: ERRO: relação "biologia" não existe
Posição: 16
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:1002)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:641)
... 28 more
SOU INICIANTE. Obrigado
Olá, rafacavagnoli
Segue o código para realizar a criação de tabelas e persistir informações.
Persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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_2_0.xsd">
<persistence-unit name="cnx-postgres-sistema" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.connection.username" value="postgres"/>
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
<property name="hibernate.connection.password" value="123456"/>
<property name="hibernate.connection.url" value="jdbc:postgresql://127.0.0.1:5432/sistema"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
<!-- somente cria as tabelas.-->
<property name="hibernate.hbm2ddl.auto" value="update"/>
<!-- deleta e depois recria as tabelas. -->
<!-- <property name="hibernate.hbm2ddl.auto" value="create-drop"/> -->
</properties>
</persistence-unit>
</persistence>
1 - Não é preciso mapear a classe aqui no xml porque voçê já marcou ela com a notação @Entity.
<class>BancoDeDados.BancoBio</class>
1 - Na classe entidade é necessário apenas acrescentar o esquema.
Classe entidade.
package br.com.sistema.classes.bean;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author Dherkyan Ribeiro
*/
@Entity
// catalog = nome banco de dados.
// schema = esquema padrão do postgres.
@Table(catalog = "sistema", schema = "public")
public class Biologia implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "bio_id", nullable = false)
private Integer bioId;
@Column(name = "bio_description", length = 255)
private String bioDescription;
public Biologia() {
}
public Biologia(Integer bioId) {
this.bioId = bioId;
}
public Integer getBioId() {
return bioId;
}
public void setBioId(Integer bioId) {
this.bioId = bioId;
}
public String getBioDescription() {
return bioDescription;
}
public void setBioDescription(String bioDescription) {
this.bioDescription = bioDescription;
}
@Override
public int hashCode() {
int hash = 0;
hash += (bioId != null ? bioId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
if (!(object instanceof Biologia)) {
return false;
}
Biologia other = (Biologia) object;
if ((this.bioId == null && other.bioId != null) || (this.bioId != null && !this.bioId.equals(other.bioId))) {
return false;
}
return true;
}
@Override
public String toString() {
return bioId + " " +bioDescription;
}
}
1 - A classe de execução permanece como a sua.
Componente Main para executar o programa.
package br.com.sistema.classes.exe;
import br.com.sistema.classes.bean.Biologia;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
/**
* @author Dherkyan Ribeiro
*/
public class Exe {
public static void main(String[] args) {
// Obj p/ gravar no bd.
Biologia biologia = new Biologia();
biologia.setBioId(1);
biologia.setBioDescription("bio 01");
// Gerenciador de persistência.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("cnx-postgres-sistema");
EntityManager em = emf.createEntityManager();
try {
// abrindo transação.
em.getTransaction().begin();
// salvando no bd.
em.persist(biologia);
// confima e encerra a transação.
em.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (em != null) {
// encerra a conexão.
em.close();
}
}
}
}
1 - Após executar o programa e criar as tabelas, comente as configurações do xml para não ficar recriando
as tabelas a cada execução.
Recomendo uma pesquisa sobre regras de nomenclatura java,
para evitar confusão e tornar seu código mais profissional.
Parabéns pela iniciativa em aprender java.
até mais.
– Dherkyan Ribeiro - Java Architect.
[quote=dherkyan@gmail.com]Olá, rafacavagnoli
Segue o código para realizar a criação de tabelas e persistir informações.
Persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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_2_0.xsd">
<persistence-unit name="cnx-postgres-sistema" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.connection.username" value="postgres"/>
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
<property name="hibernate.connection.password" value="123456"/>
<property name="hibernate.connection.url" value="jdbc:postgresql://127.0.0.1:5432/sistema"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
<!-- somente cria as tabelas.-->
<property name="hibernate.hbm2ddl.auto" value="update"/>
<!-- deleta e depois recria as tabelas. -->
<!-- <property name="hibernate.hbm2ddl.auto" value="create-drop"/> -->
</properties>
</persistence-unit>
</persistence>
1 - Não é preciso mapear a classe aqui no xml porque voçê já marcou ela com a notação @Entity.
<class>BancoDeDados.BancoBio</class>
1 - Na classe entidade é necessário apenas acrescentar o esquema.
Classe entidade.
package br.com.sistema.classes.bean;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author Dherkyan Ribeiro
*/
@Entity
// catalog = nome banco de dados.
// schema = esquema padrão do postgres.
@Table(catalog = "sistema", schema = "public")
public class Biologia implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "bio_id", nullable = false)
private Integer bioId;
@Column(name = "bio_description", length = 255)
private String bioDescription;
public Biologia() {
}
public Biologia(Integer bioId) {
this.bioId = bioId;
}
public Integer getBioId() {
return bioId;
}
public void setBioId(Integer bioId) {
this.bioId = bioId;
}
public String getBioDescription() {
return bioDescription;
}
public void setBioDescription(String bioDescription) {
this.bioDescription = bioDescription;
}
@Override
public int hashCode() {
int hash = 0;
hash += (bioId != null ? bioId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
if (!(object instanceof Biologia)) {
return false;
}
Biologia other = (Biologia) object;
if ((this.bioId == null && other.bioId != null) || (this.bioId != null && !this.bioId.equals(other.bioId))) {
return false;
}
return true;
}
@Override
public String toString() {
return bioId + " " +bioDescription;
}
}
1 - A classe de execução permanece como a sua.
Componente Main para executar o programa.
package br.com.sistema.classes.exe;
import br.com.sistema.classes.bean.Biologia;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
/**
* @author Dherkyan Ribeiro
*/
public class Exe {
public static void main(String[] args) {
// Obj p/ gravar no bd.
Biologia biologia = new Biologia();
biologia.setBioId(1);
biologia.setBioDescription("bio 01");
// Gerenciador de persistência.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("cnx-postgres-sistema");
EntityManager em = emf.createEntityManager();
try {
// abrindo transação.
em.getTransaction().begin();
// salvando no bd.
em.persist(biologia);
// confima e encerra a transação.
em.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (em != null) {
// encerra a conexão.
em.close();
}
}
}
}
1 - Após executar o programa e criar as tabelas, comente as configurações do xml para não ficar recriando
as tabelas a cada execução.
Recomendo uma pesquisa sobre regras de nomenclatura java,
para evitar confusão e tornar seu código mais profissional.
Parabéns pela iniciativa em aprender java.
até mais.
– Dherkyan Ribeiro - Java Architect.[/quote]
-Continuou dando errado, se eu criar as tabelas pelo BD ele fica excelente. Sé tem esse problema de não conseguir criar a tabela.
Obrigado
E ai blz,
Bom é o seguinte, em seu log de erro veja que seu select está com o nome da tabela que será criada no banco
de dados quando deveria ser o nome da sua entidade.
o correto seria assim.
abaixo vai um link de um exemplo que postei sobre o assunto.
http://www.guj.com.br/java/284441-solucao--erro-no-persistence-provider-for-entitymanager-named