Erro: Hibernate Annotation - Mapped By reference an unknown target entity property

Meu primeiro post aqui ^^
Pessoal… Já procurei este erro aqui no fórum, porém o que eu achei não resolveu meu problema e por isso estou criando este novo tópico.
Meu Hibernate está exibindo o seguinte erro ao tentar criar as tabelas.

Exception in thread "main" org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: modelo.Bairro.Cidade in modelo.Cidade.bairros at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:552) at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:517) at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:43) at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130) at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:316) at org.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:756) at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:93) at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:61) at hibernate.TabelasFactory.create(TabelasFactory.java:9) at hibernate.TabelasFactory.main(TabelasFactory.java:16)

Segue abaixo as Classes Bairro e em seguida a Classe Cidade

[code]package modelo;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity //Anotação que informa que esta classe é de persistência
@Table(schema=“noLugar”) //Anotação que informa a tabela e esquema mapeada
public class Bairro implements Serializable{

private static final long serialVersionUID = 1L;

@Id //Definição da chave primária
@GeneratedValue(strategy = GenerationType.IDENTITY) //Definição do mecanismo da chave primária
@Column(name="idBairro") //Definição da coluna mapeada para o atributo
private int    idBairro;

@Column(name="bairro", length=40, nullable=false)
private String bairro;

//Muitos bairros tem uma cidade
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="idCidade",	insertable=true, updatable=true)
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.SAVE_UPDATE)
private Cidade cidade;

public Bairro(){
}
public int getIdBairro() {
	return idBairro;
}
public void setIdBairro(int idBairro) {
	this.idBairro = idBairro;
}
public String getBairro() {
	return bairro;
}
public void setBairro(String bairro) {
	this.bairro = bairro;
}
public Cidade getCidade() {
	return cidade;
}
public void setCidade(Cidade cidade) {
	this.cidade = cidade;
}

}[/code]

[code]package modelo;

import java.io.Serializable;
import java.util.Collection;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity //Anotação que informa que esta classe é de persistência
@Table(schema=“noLugar”) //Anotação que informa a tabela e esquema mapeada
public class Cidade implements Serializable{

private static final long serialVersionUID = 1L;

@Id //Definição da chave primária
@GeneratedValue(strategy = GenerationType.IDENTITY) //Definição do mecanismo da chave primária
@Column(name="idCidade") //Definição da coluna mapeada para o atributo
private int		idCidade;

@Column(name="cidade", length=40, nullable=false)
private String 	cidade;

//Uma Cidade tem vários bairros
@OneToMany(mappedBy="Cidade", fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
private Collection<Bairro> bairros;

public Cidade(){
}

public Collection<Bairro> getBairros() {
	return bairros;
}
public void setBairros(Collection<Bairro> bairros) {
	this.bairros = bairros;
}
public int getIdCidade() {
	return idCidade;
}
public void setIdCidade(int idCidade) {
	this.idCidade = idCidade;
}
public String getCidade() {
	return cidade;
}
public void setCidade(String cidade) {
	this.cidade = cidade;
}

}[/code]

Segue abaixo meu gerador de tabelas

[code]package hibernate;

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

public class TabelasFactory {

public static void create(AnnotationConfiguration cfg) {   
    new SchemaExport(cfg).create(false, true);   
}   

public static void main(String[] args) {
	AnnotationConfiguration cfg = new AnnotationConfiguration();
	cfg.addAnnotatedClass(modelo.Bairro.class);
    cfg.addAnnotatedClass(modelo.Cidade.class);
    create(cfg);   

}   

} [/code]

E por último meu Hibernate.cfg.xml

[code]<?xml version="1.0" encoding="utf-8"?>

	<property name="connection.driver_class">
		com.mysql.jdbc.Driver
	</property>
	
	<property name="connection.url">
		jdbc:mysql://localhost/noLugar
	</property>
	
	<property name="dialect">
		org.hibernate.dialect.MySQLDialect
	</property>
	
	<property name="show_sql">true</property>
	<property name="connection.username">root</property>
	<property name="connection.password">123</property>
	<property name="connection.pool_size">10</property>
	
	<!-- mapping classes -->
	<mapping class="modelo.Bairro"  />
 	<mapping class="modelo.Cidade" />
</session-factory>

[/code]

Tirando o relacionamento OneToMany e ManyToOne…
Deixando apenas as tabelas sem um relacionando ele gera as tabelas normalmente… O problema é quando coloco o relacionamento entre eles…
Alguém poderia me ajudar?

testa ai :smiley:

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "idCidade")
    private Cidade  cidade;
    
    @OneToMany(mappedBy = "Bairro")
    private List<Bairro> bairros;

abraco

[quote]@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = “idCidade”)
private Cidade cidade;

@OneToMany(mappedBy = “Bairro”)
private List bairros; [/quote]

Deu erro…
Aí coloquei da seguinte forma:

[code] //Muitos bairros tem uma cidade
@ManyToOne()
@Cascade(CascadeType.PERSIST)
@JoinColumn(name = “idCidade”)
private Cidade cidade;

//Uma Cidade tem vários bairros
@OneToMany(mappedBy = "Bairro")  
private List<Bairro> bairros;[/code]

Deu o seguinte erro…

Exception in thread "main" org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: modelo.Bairro.Bairro in modelo.Cidade.bairros at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:552) at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:517) at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:43) at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130) at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:316) at org.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:756) at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:93) at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:61) at hibernate.TabelasFactory.create(TabelasFactory.java:9) at hibernate.TabelasFactory.main(TabelasFactory.java:16)

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "idCidade")
private Cidade cidade;

@OneToMany(mappedBy = "bairro")
private List<Bairro> bairros;

coloca ali o mappedyBy em minusculo igual ta ali em cima
e avisa :smiley:

seu mapeamento não esta correto.
de uma olhada em http://www.hibernate.org/hib_docs/annotations/reference/en/html/entity.html#d0e1136
leia como funciona o oneToMany/manyToOne.

[]´s

[quote]Hibernate docs says

In a bidirectional relationship, one of the sides (and only one) has to be the owner: the owner is responsible for the association column(s) update. To declare a side as not responsible for the relationship, the attribute mappedBy is used. mappedBy refers to the property name of the association on the owner side

[/quote]

vc vc utiliza ali o manytoone pra poder trazer o list…
funciona sim :smiley:

public class Banco implements Serializable {
    
    @Id       
    @Column(name = "idBanco")
    @GeneratedValue(strategy = GenerationType.SEQUENCE)     
    private int    id;
    private int    codigo;
    private String nome;
    
    @OneToMany(mappedBy = "banco")
    private List<Agencia> agencias;
public class Agencia implements Serializable {

    @Id
    @Column(name = "idAgencia")
    @GeneratedValue(strategy = GenerationType.SEQUENCE)        
    private int    id;
    private int    numero;
    private String   digito;
    private String nome;

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "idbanco")
    private Banco  banco;

    @OneToMany(mappedBy = "agencia")
    private List<Conta> contas;

Opa!!!

O erro era a letra mesmo…
Não sabia que tinha de ser em minúsculo…
Os tutoriais que peguei nenhum alertava sobre isso…

Obrigado!!! :smiley:

O Mapeamento estava certo…

Errado:

Certo:

o mappedBy tem que estar todo em letra minúscula…

eh que ali ele referencia o objeto que tem dentro da classe…
como la na tua ta assim Cidade cidade…
vc mapeia pelo cidade, se tivesse ciDAde, vc teria que colocar ali como ciDAde…
no mapped by eh a referencia do objeto da classe…

espero ter ajudado!

não, o mappedBy deve apontar para quem “manda” no relacionamento. de novo:

In a bidirectional relationship, one of the sides (and only one) has to be the owner: the owner is responsible for the association column(s) update. To declare a side as not responsible for the relationship, the attribute mappedBy is used. mappedBy refers to the property name of the association on the owner side 

leia o link que passei. como falei desde o inicio o mapeamento estava errado, pq o mappedBy estava errado.

[]´s

intao amigo olha ali o exemplo que te passei… eh bem por isso que tem o mapped by…
pra dizer que quem manda no relacionamento (List de Agencias) eh o BANCO!!!
o List eh transiente… ele nao persiste!
se nao tiver vc nao consegue retornar a colecao

e minha monografia foi em cima de hibernate annotations… eu boa parte do referencial!

mas tenta tirar o relacionamento mapped by ali e tenta retornar o list pra ver :stuck_out_tongue:

abraco

Perdão…

Existe algum tipo de procedimento para quando uma dúvida é resolvida com sucesso?

Aproveitando para exclarecer…
Acredito que jgbt tenha olhado apenas a correção de Ivffilho…
No entanto no exemplo que eu tinha colocado (o primeiro post) o mapeado já está correto…
O único erro é na letra que deveria estar em minúsculo…

Ivffilho deve ter se confundido ao digitar o “bairro”…

Valeu galera :smiley:

Agora está dando outro erro…
Acho que vou abrir outro tópico…
Estou dando uma pesquisada aqui no GUJ antes…

Obrigado.

Olá a todos!
Na minha aplicação também está dando esse erro na geração das tabelas, mas já chequei mappedBy e tá tudo certo. No meu caso, estou fazendo um relacionamento N-N entre a classe Pedido e Item que resulta na classe PedidoItem, usando a classe PedidoItemPK para instaciar as chaves estrangeiras que compõem a chave composta.
No mapeamento da classe Pedido não dá erro, só e item e ainda não consegui exergar o motivo. A seguir o erro e as classes:

10:34:02,218 DEBUG AnnotationBinder:1086 - Processing annotations of br.gov.ma.mp.ssm.modelo.Pedido.pedidosItens
10:34:02,218 DEBUG Ejb3Column:161 - Binding column null unique false
10:34:02,218 DEBUG Ejb3Column:161 - Binding column pedidosItens unique false
10:34:02,218 DEBUG Ejb3Column:161 - Binding column null unique false
10:34:02,218 DEBUG Ejb3Column:161 - Binding column element unique false
10:34:02,218 DEBUG Ejb3Column:161 - Binding column mapkey unique false Exception in thread “main” org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: br.gov.ma.mp.ssm.modelo.PedidoItem.item in br.gov.ma.mp.ssm.modelo.Item.pedidosItens
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:552)
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:517)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:43)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:316)
at org.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:756)
at org.hibernate.tool.hbm2ddl.SchemaExport.(SchemaExport.java:93)
at org.hibernate.tool.hbm2ddl.SchemaExport.(SchemaExport.java:61)
at GeraTabelas.main(GeraTabelas.java:26)

Classes:

@Entity
public class Pedido implements Serializable {
@Id
@GeneratedValue
private int idPedido;

[b]@OneToMany(mappedBy = "pedido", fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
private Collection<PedidoItem> pedidosItens;

[/b]
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = “idOrgao”, insertable = true, updatable = true)
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.SAVE_UPDATE)
private Orgao orgao;

@Temporal(TemporalType.DATE)
private Date dataPedido;


}

@Entity
public class Item implements Serializable {
@Id
@GeneratedValue
private int idItem;

[b]@OneToMany(mappedBy="item", fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
private Collection <PedidoItem> pedidosItens;[/b]

@Column(nullable = false, insertable = true, updatable = true)
private int codigo;

@Column(nullable = false, insertable = true, updatable = true, length = 300)
private String descricao;


}

@Embeddable
public class PedidoItemPK implements Serializable {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = “idPedido”)
private Pedido pedido;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "idItem")
private Item item;

/* gets sets */


}

@Entity
public class PedidoItem implements Serializable {
@EmbeddedId
public PedidoItemPK chaveComposta;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "idStatusItem", insertable = true, updatable = true)
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.SAVE_UPDATE)
private StatusItem statusItem;

@Column(nullable = false, insertable = true, updatable = true, length = 400)
private String observacao;

@Column(nullable = false, insertable = true, updatable = true)
private int qtdPedido;


}

Olá pessoal, estou com o mesmo erro, ja tentei de tudo ai…
os nomes das classes e dos atributos do banco estao todos correotos…

@Table(name = "pe_processrole", schema = "transforms")
public class ProcessRole extends EntityModel {

	@Id
	@Column(name = "int_id_PE_ProcessRole")
	private long id;

	@OneToMany(mappedBy = "pe_processrole", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private List<Activity> activity;
@Table(name = "pe_activity", schema = "transforms")
public class Activity extends EntityModel {

	@Id
	@Column(name = "int_id_PE_Activity")
	private long id;

	@Column(name = "vchr_activity")
	private String description;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "PE_ProcessRole_int_id_PE_ProcessRole", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private ProcessRole processRole;

desde já agradeço

Alabê Duarte

lembrando que o erro é:

Error connect to the database
org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: bahiaInovacao.transforms.processEditor.model.entityData.Activity.pe_processrole in bahiaInovacao.transforms.processEditor.model.entityData.ProcessRole.activity
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:552)
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:517)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:43)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130)
(…)