JPA Erro - ERRO NOVO (2)

Galera, boa noite!

Bom, estou estudando JPA + HIBERNATE, através de video aulas, e tive um problema:

Inicialmente ao criar o projeto optei por JAVA PROJECT, e foi tudo bem, porem ao fazer a persistencai de leitura, ele deu problema, pq o persistence.xml estava fora do META-INF, ai migrei o projeto para JPA PROJECT ( USO ECLIPSE ), e foi tudo bem…

Porem, neste momento, o V.O. People que eu uso, acusou um erro na @Entity.

O estranho é q mesmo com linha de error ele rola normalmente…

Vejam a classe:

package br.com.jpa.entity;

import java.io.Serializable;

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

@Entity(name="People")
public class People implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	public People() {
	}
	
	@Id
	@Column(nullable=false,name="ID")
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	@Column(nullable=false,name="NAME")
	private String name;
	@Column(nullable=false,name="AGE")
	private Integer age;
	

	public People(Integer id, String name, Integer age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public Integer getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.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;
		People other = (People) obj;
		if (age == null) {
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	
}

Acusa erro na linha:

Erro: Table “People” cannot be resolved ~ ou algo assim!

Alguma idéia?

Vlw!!!

Amigo, boa noite!

Você provavelmente não tem uma tabela chamada “People” (considere o case sensitive).

Você deve adicionar mais uma anotação aí, depois de “@Entity(name=“People”)” e antes da definição da classe… ficaria assim:


//...
import javax.persistence.Id;  
  
@Entity
@Table(name="nome_da_tabela") // substitua "nome_da_tabela" pelo nome da tabela real... (considere CaseSensitive)
public class People implements Serializable{  

Se você não colocar a anotação “@Table”, o JPA tenta encontrar uma tabela com o mesmo nome da classe… e caso não encontre, você tem essa mensagem de erro.

Espero ter ajudado!

Abraço,

Então, só se as annotations da video-aula pras que eu estou usando (3.6.0) mudaram, pq na video-aula ele não coloca e nem cita nada sobre essa annotation @table!

E o mais estranho, é que Funciona normalmente o código, só que fica marcado como ERRO!

Irei tentar colocar isso, quando chegar em casa, e depois posto o resultado, anyway, vlw!!!

[quote=Duzas87]Galera, boa noite!

Bom, estou estudando JPA + HIBERNATE, através de video aulas, e tive um problema:

Inicialmente ao criar o projeto optei por JAVA PROJECT, e foi tudo bem, porem ao fazer a persistencai de leitura, ele deu problema, pq o persistence.xml estava fora do META-INF, ai migrei o projeto para JPA PROJECT ( USO ECLIPSE ), e foi tudo bem…

Porem, neste momento, o V.O. People que eu uso, acusou um erro na @Entity.

O estranho é q mesmo com linha de error ele rola normalmente…

Vejam a classe:

package br.com.jpa.entity;

import java.io.Serializable;

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

@Entity(name="People")
public class People implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	public People() {
	}
	
	@Id
	@Column(nullable=false,name="ID")
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	@Column(nullable=false,name="NAME")
	private String name;
	@Column(nullable=false,name="AGE")
	private Integer age;
	

	public People(Integer id, String name, Integer age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public Integer getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.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;
		People other = (People) obj;
		if (age == null) {
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	
}

Acusa erro na linha:

Erro: Table “People” cannot be resolved ~ ou algo assim!

Alguma idéia?

Vlw!!!
[/quote]

Olá Duzão,

Então, mesmo criando um “Java Project”, você poderia ter ido em no menu: “Project/Properties/Project Facets” e adicionado JPA ao seu projeto java “comum” que você teria todas as funcionalidade de JPA normalmente.

Quanto à anotação @Entity, o problema, provavelmente, deve ser o case do nome da sua tabela. Verifique se o nome da tabela não é “people”, por exemplo. Esse problema pode não ter resultado em Exception porque o banco deve ter desconsiderado o case adotado (não tenho certeza).

Dá uma conferida e posta ae…

[]s
Éberson

Perfeito, irei testar as 2 dicas e postar o resultado!

Porem, quanto ao case_sensitive não é, ja testei de todas as maneiras e o erro persiste!

Quanto a migração do Java Project para JPA Project, eu fiz utilizando as próprias ferramentas do eclipse, eu cliquei com o botão direito no projeto e la embaixo tem uma função, esqueci o nome, que faz exatamente isso, algo como:

Add JPA to project - Não é isso, só um exemplo!

Apartir disso o projeto ganhou o META-INF e começou a ter os problemas citados nesse tópico!

Mas enfim, irei testar as 2 soluções e postar o resultado obtido!

Desde ja,

Obrigado ao Eberson e ao Rodrigo!

É pra ser assim:

@Entity
@Table(name="People") 

Galera, buenas notches!!!

Enfim, conferi as dicas, e o veredicto é:

A tabela chama-se “people” neste case.

E o problemo, de fato era: @Table que estava faltando!!!

De qualquer jeito obrigado galera, na video-aula não estavam usando, agora nao sei se o NetBeans compreende estas Annotations de outra forma!

Galera, boa noite!

Continuar com as rotinas de teste no JPA, mais erros!!!

Vou tentar por tudo neste único thread para não ficar floodando o forum!!!

Enfim, explicarei, a tentativa era fazer OneToOne utilizando o JPA, bem, tudo criado certinho!

2 classes: People e PeopleInfo aonde um People tem um PeopleInfo e vice-versa!

Ao tentar executar estes comandos:

People p = em.find(People.class, 4); PeopleInfo pinfo = new PeopleInfo(3, p, "Obser 3", "Jaspion", "boneco" ); // em.persist(pinfo); p.setInfo(pinfo); System.out.println( "A pessoa é " + p.getName() + " e sua info é " + p.getInfo().getNameOfPet() );

O erro:

Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.jpa.entity.People.info -> br.com.jpa.entity.PeopleInfo
	at org.hibernate.engine.CascadingAction$9.noCascade(CascadingAction.java:387)
	at org.hibernate.engine.Cascade.cascade(Cascade.java:172)

Pelo o que a aula mostrava, era apenas colocar um cascade=CascadeType.ALL que iria de boa, blz, eu faço isso, ai na video-aula funfa, comigo não, e esta tudo idêntico, pelo menos era pra estar, olhei 5x o codigo!!!

Mas ai, muda o jogo, o seguinte erro ocorre:

Exception in thread "main" javax.persistence.EntityNotFoundException: Unable to find br.com.jpa.entity.PeopleInfo with id 0 at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:133) at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:233)

Porem, eu nao estou tentando salvar na info = 0, e sim criar uma info = 3 certo?

No pc a video-aula foi certo, aqui nao vai, ja fiz muitas alteraçoões e nenhuma surtiu efeito!

Peço paciencia pois estou iniciando em JPA agora, e provavelmente seja algo tonto!

Anyway, obrigado desde ja!

Alguemmmm ???

[quote=Duzas87]Galera, buenas notches!!!

Enfim, conferi as dicas, e o veredicto é:

A tabela chama-se “people” neste case.

E o problemo, de fato era: @Table que estava faltando!!!

De qualquer jeito obrigado galera, na video-aula não estavam usando, agora nao sei se o NetBeans compreende estas Annotations de outra forma!

[/quote]

Uma coisa que pode estar acontecendo neste caso é a conexão do JPA estar desatualizada também. Neste caso no painel “Data Source Explorer” abra a conexão e atualize.
Muitos problemas referentes a comparação das entidades do JPA com as tabelas no banco serão resolvidas.

[quote=Duzas87]Galera, buenas notches!!!

Enfim, conferi as dicas, e o veredicto é:

A tabela chama-se “people” neste case.

E o problemo, de fato era: @Table que estava faltando!!!

De qualquer jeito obrigado galera, na video-aula não estavam usando, agora nao sei se o NetBeans compreende estas Annotations de outra forma!

[/quote]

Uma coisa que pode estar acontecendo neste caso é a conexão do JPA estar desatualizada também. Neste caso no painel “Data Source Explorer” abra a conexão e atualize.
Muitos problemas referentes a comparação das entidades do JPA com as tabelas no banco serão resolvidas.

Verifique se a seguinte propriedade, no"persistence.xml", está escrita de forma correta:

hibernate.hbm2[color=red]ddl[/color].auto

[quote=Dan Paranhos]Verifique se a seguinte propriedade, no"persistence.xml", está escrita de forma correta:

hibernate.hbm2[color=red]ddl[/color].auto
[/quote]

Dan, evite ressuscitar tópicos antigos.
Esse já tem 2 anos.