Problema Hibernate OneToOne

31 respostas
E

O seguinte erro esta ocorrendo

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

@Entity
@Table(name = "cbo")
public class Cbo {
	@Id
	@GeneratedValue
	@Column(name = "cbo_codigo", nullable = false)
	private int cboCodigo;
	@Column(name = "cbo_funcao", length = 255)
	private String funcao;
	@Column(name = "num_vagas", length = 2)
	private int numVagas;

	public Cbo(int cbCodigo, String funcao, int numVagas) {
		super();
		this.cboCodigo = cbCodigo;
		this.funcao = funcao;
		this.numVagas = numVagas;
	}
//Getters Setters



import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name = "Ocupacao")
public class Ocupacao {
	@Id
	@GeneratedValue
	private int ocu_codigo;
	@Column(name = "ocu_ultimo_emprego", length = 256)
	private String ultimoEmprego;
	@Column(name = "ocu_observacao", length = 256)
	private String observacao;
	@Column(name = "ocu_situacao", length = 2)
	private boolean situacao;
	@Column(name = "ocu_data_situacao")
	private Date dataSituacao;

	@OneToOne(cascade = { CascadeType.ALL })
	@JoinColumn(name = "cbo_codigo", nullable = false)
	private Cbo cbo;



o Erro

Exception in thread "main" java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
	at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1868)
	at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:768)
	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:687)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3435)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3389)
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1341)
	at org.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:931)

Ja procurei varios exemplos e realmente nao estou conseguindo saber aonde estao o erro se alguem com experiencia em hibernate puder me ajudar fico grato.

31 Respostas

Lemuras

Vc tem certeza que o erro esta entre essas classes?
Pq o erro fala sobre uma ligação OneToMany e não sobre uma OneToOne.

tmvolpato

@OneToOne(cascade = { CascadeType.ALL }) @JoinColumn(name = "cbo_codigo", nullable = false) private Cbo cbo;

Será que essa classe Cbo está @OneToMany?

Lemuras

Pelo q eu vi não encontrei nenhum erro. Tipo da uma olhada no resto do seu codigo e ve se não tem nada de errado nele, pq o hibernate confere tudo antes de inicia, e se tive alguma coisa errada ele para.
Isso ja aconteceu muitas vezes comigo, dele aponta algum erro em outro lugar.

E

Desculpa o erro correto é esse :

Exception in thread "main" java.lang.NoSuchMethodError: javax.persistence.OneToOne.orphanRemoval()Z at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1616) at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:768) at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:687) at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3435) at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3389) at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1341) at org.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:931) at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:188) at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:156) at br.com.sistemarh.modelo.entidade.testeMain.main(testeMain.java:20)

OneToOne mesmo,. é que antes eu coloquei OneToMany para testar e acabei copiando o erro , eu ja verifiquei tudo nessas duas clases, fiz conforme os exemplos que vi nos foruns e realmente eu nao sei aonde estao o erro;

tmvolpato

cole a classe Cbo ai

E

Mais uma coisa quando eu mudo de OneToOne para ManyToOne ou ManyToMany so para fazer testes funciona normal, o problema esta no OneToOne, e OneToMany

E
tmvolpato:
cole a classe Cbo ai
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "cbo")
public class Cbo {
	@Id
	@GeneratedValue
	@Column(name = "cbo_codigo", nullable = false)
	private int cboCodigo;
	@Column(name = "cbo_funcao", length = 255)
	private String funcao;
	@Column(name = "num_vagas", length = 2)
	private int numVagas;

	public Cbo(int cbCodigo, String funcao, int numVagas) {
		super();
		this.cboCodigo = cbCodigo;
		this.funcao = funcao;
		this.numVagas = numVagas;
	}

	public Cbo() {
		super();
	}

	public int getCboCodigo() {
		return cboCodigo;
	}

	public void setCboCodigo(int cboCodigo) {
		this.cboCodigo = cboCodigo;
	}

	public String getFuncao() {
		return funcao;
	}

	public void setFuncao(String funcao) {
		this.funcao = funcao;
	}

	public int getNumVagas() {
		return numVagas;
	}

	public void setNumVagas(int numVagas) {
		this.numVagas = numVagas;
	}

	@Override
	public String toString() {
		return "Cbo [codigo=" + cboCodigo + ", funcao=" + funcao
				+ ", numVagas=" + numVagas + "]";
	}

}
tmvolpato

Você só tem essas 2 classes no sistema com relacionamento?

E
tmvolpato:
Você só tem essas 2 classes no sistema com relacionamento?

Sim ate tenho outras.. mas como estava dando problema eu criei novo projeto e coloquei so essas duas pra teste.
ai ta o main

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class testeMain {
	public static void main(String[] args) {

		Configuration cfg = new Configuration();
/
		cfg.addAnnotatedClass(Ocupacao.class);
		cfg.addAnnotatedClass(Cbo.class);


		SchemaExport se = new SchemaExport(cfg);
		se.create(true, true);
	}
}

as outras todas funcionam so essa que é OneToOne as outras sao ManyToMany

romarcio
Acho que o mapeamento seria assim:
@Entity
@Table(name = "cbo")
public class Cbo {
	@Id
	@GeneratedValue
	@Column(name = "cbo_codigo", nullable = false)
	private int cboCodigo;
	@Column(name = "cbo_funcao", length = 255)
	private String funcao;
	@Column(name = "num_vagas", length = 2)
	private int numVagas;
	@OneToOne(mappedBy="cbo", cascade = CascadeType.ALL)
	private Ocupacao ocupacao;
//...	
}
@Entity
@Table(name = "Ocupacao")
public class Ocupacao {
	@Id
	@GeneratedValue
	private int ocu_codigo;
	@Column(name = "ocu_ultimo_emprego", length = 256)
	private String ultimoEmprego;
	@Column(name = "ocu_observacao", length = 256)
	private String observacao;
	@Column(name = "ocu_situacao", length = 2)
	private boolean situacao;
	@Column(name = "ocu_data_situacao")
	private Date dataSituacao;

	@OneToOne
	@JoinColumn(name = "cbo_codigo", nullable = false)
	private Cbo cbo;
//...
}
E
romarcio:
Acho que o mapeamento seria assim:
@Entity
@Table(name = "cbo")
public class Cbo {
	@Id
	@GeneratedValue
	@Column(name = "cbo_codigo", nullable = false)
	private int cboCodigo;
	@Column(name = "cbo_funcao", length = 255)
	private String funcao;
	@Column(name = "num_vagas", length = 2)
	private int numVagas;
	@OneToOne(mappedBy="cbo", cascade = CascadeType.ALL)
	private Ocupacao ocupacao;
//...	
}
@Entity
@Table(name = "Ocupacao")
public class Ocupacao {
	@Id
	@GeneratedValue
	private int ocu_codigo;
	@Column(name = "ocu_ultimo_emprego", length = 256)
	private String ultimoEmprego;
	@Column(name = "ocu_observacao", length = 256)
	private String observacao;
	@Column(name = "ocu_situacao", length = 2)
	private boolean situacao;
	@Column(name = "ocu_data_situacao")
	private Date dataSituacao;

	@OneToOne
	@JoinColumn(name = "cbo_codigo", nullable = false)
	private Cbo cbo;
//...
}

O erro continua

tmvolpato

deixe daquele jeito

caso a classe Cbo nao precise conhecer a classe Ocupação, mantenha daquele jeito

coloque assim

@OneToOne(cascade = CascadeType.ALL, optional = true, fetch = FetchType.EAGER, orphanRemoval = true) @JoinColumn(name = "cbo_codigo", nullable = false) private Cbo cbo;

tente ai

tmvolpato

o que é Cbo?

romarcio

Esse erro acontece quando você tenta criar as tabelas no banco? Ou quando você já tem elas lá e tenta fazer alguma operação de persistência?

E

Cbo = Cadastro Brasileiro de Ocupacoes

orphanRemoval = true esse nao deu pra colocar

tmvolpato

Ezonic:
Cbo = Cadastro Brasileiro de Ocupacoes

orphanRemoval = true esse nao deu pra colocar

é pra ter sim é do jpa

tmvolpato

eu nao trabalho dessa maneira para gerar a tabela

mas nao custa arruma sua Classe Ocupacao esta sem @Column no int (PrimaryKey) (nao é para ser isso, mas arrume)

E

realmente o meu nao da pra colocar nem aparece como opcao quando aperto Ctrl+ espaco
sera que tem algum problema com o meu eclipse?

E

tmvolpato:
eu nao trabalho dessa maneira para gerar a tabela

mas nao custa arruma sua Classe Ocupacao esta sem @Column no int (PrimaryKey) (nao é para ser isso, mas arrume)

Arrumei mais o erro persistiu

romarcio

Pode ser algum bug na versão do hibernate ou da Jpa que você está usando.
Tenta trocar os jar por outra versão.

tmvolpato

Ezonic:
realmente o meu nao da pra colocar nem aparece como opcao quando aperto Ctrl+ espaco
sera que tem algum problema com o meu eclipse?

é pra ter

eu estava olhando e eu errei
numa coisa, sobre o relacionamento
se vc for deixar unidirecional
tem que deixar dessa maneira

@OneToOne(cascade = CascadeType.ALL, optional = true, fetch = FetchType.EAGER, orphanRemoval = true) @PrimaryKeyJoinColumn private Cbo cbo;

Agora vai

testa ai

tmvolpato

outra coisa legal é sempre voce
definir qual vai ser o tipo de Strategy

@GeneratedValue(strategy = GenerationType.(opcoes)

para nao se preocupar com isso use identity ou auto

E

meu hibernate e jpa é 4.1.4 recomenda outra? porque realmente o orphanRemoval nao aparece pra mim.

romarcio

Na verdade eu ainda não testei nenhuma versão do Hibernate 4, ainda uso o 3.6.

E

Beleza vou baixar outras versos pra ver se é esse o problema, porque ja segui todos os modelos na internet e os passos de voces mesmo assim o problema nao resolver
Muito obrigado pela atencao romarcio e tmvolpato

tmvolpato

o orphanRemoval eh do JPA - estranho

tem o .jar do JPA 2.0 ai?

E

tenho esse hibernate-jpa-2.0-api-1.0.1.Final.jar

tmvolpato

Ezonic:
tenho esse hibernate-jpa-2.0-api-1.0.1.Final.jar

ta certo…correto

E

tmvolpato obrigadao cara pela atencao, ta funcionando certinho agora, baixe um novo jpa subistitui o char, e o orphanRemoval ja aparece e as minhas tabelas foram todas criadas
Muito obrigado mesmo :slight_smile:

tmvolpato

QUE BLZ

Att

tmvolpato

coloque o post como resolvido

Criado 11 de julho de 2012
Ultima resposta 12 de jul. de 2012
Respostas 31
Participantes 4