Dúvida em mapear coleção - hibernate annotations

Boa tarde…

Estou com dúvida sobre como mapear coleção, estava vendo os exemplo do doc do hibernate mas não ajudaram mt.
Vou postar o que fiz até agora, e vão me corrigindo. Tenho uma tabela artista e tera mts musicas, por tanto relacionamento 1:*

Musica

package artista;

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

@Entity
@Table(name = "musica")
public class Musica {
	
	@SequenceGenerator(name = "sequence_musica", sequenceName = "sequence_musica")
	
	@Id 	
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence_musica")	
	private int id;
	@Column(name = "nome", nullable = false, length = 25)
	private String nome;
	@ManyToOne
    @JoinColumn(name="codArtista")
	private Artista artista;
	
	public Musica(){
		
	}
	
	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public String getNome() {
		return nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public Artista getArtista() {
		return artista;
	}
	
	public void setArtista(Artista artista) {
		this.artista = artista;
	}
	
}

Artista

package artista;

import java.util.ArrayList;
import java.util.List;

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

@Entity
@Table(name = "artista")
public class Artista {
	
	@SequenceGenerator(name = "sequence_artista", sequenceName = "sequence_artista")
	
	@Id 	
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence_artista")	
	private int id;
	@Column(name = "nome", nullable = false, length = 25)
	private String nome;
	@OneToMany(mappedBy="id")
	private List<Musica> lista = new ArrayList<Musica>(); 	 
	
	public Artista(){		
	}
	
	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public String getNome() {
		return nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}

	public List<Musica> getLista() {
		return lista;
	}

	public void setLista(List<Musica> lista) {
		this.lista = lista;
	}	
	
}

Base de dados:

create table artista (id int, nome varchar2(25));
alter table artista add constraint pk_artista primary key (id);
create sequence sequence_artista increment by 1;


create table musica (id int, nome varchar2(25), codArtista int);
alter table musica add constraint pk_musica primary key (id);
create sequence sequence_musica increment by 1;
ALTER TABLE musica add constraint fk_musica_artista foreign key (codArtista) references artista (id);

Minha dúvida e justamente em como mapear o artista, em @OneToMany(mappedBy=“id”) no mappedBy vou apontar para o que?

desde já agradeço!

Na sua lista, vc deve apontar para o atributo “artista” da entidade Música.

Ficaria:

     @OneToMany(mappedBy="artista")  
     private List<Musica> lista = new ArrayList<Musica>(); 

Teste e poste o resultado! :wink:

Minha querida

Faça o seu relacionamento do lado da Tabela Artista que irá ficar assim:

package artista;

import java.util.ArrayList;
import java.util.List;

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

@Entity
@Table(name = "artista")
public class Artista {
	
	@SequenceGenerator(name = "sequence_artista", sequenceName = "sequence_artista")
	
	@Id 	
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence_artista")	
	private int id;
	@Column(name = "nome", nullable = false, length = 25)
	private String nome;
	@OneToMany(cascade=CascadeType.All, fetch=FetchType.LAZY)
	private List<Musica> lista = new ArrayList<Musica>(); 	 
	
	public Artista(){		
	}
	
	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public String getNome() {
		return nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}

	public List<Musica> getLista() {
		return lista;
	}

	public void setLista(List<Musica> lista) {
		this.lista = lista;
	}	
	
}

Porque quando vc persistir Artista, com o cascade setado na annotation, vc tb persistira as músicas relacionadas a esse artista. Não é necessário usar mappedby

Um Abraço.

Das duas formas gera esse erro: Unknown entity: pacote.Musica

Como está configurado o seu hibernate.cfg.xml? Veja se têm algo deste tipo:

<mapping class="pacote.Musica"/>
<mapping class="pacote.Artista"/>

Abraço!

Não se esqueça que suas classes estão (segundo o código que vc postou) no pacote “artista”.
Então, no hibernate.cfg.xml, use:

     <mapping class="artista.Musica"/>  
     <mapping class="artista.Artista"/>

Sim sim, esta como artista

Poste o teu hibernate.cfg.xml! :wink:

Em qual diretório vc está salvando o teu hibernate.cfg.xml?

No mesmo pacote das classes, só que no main faço assim:

package artista;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.classic.Session;

import annotations.HibernateUtil;

public class Main {
	
	public static void main(String[] args) {
		try{
			SessionFactory sessionFactory = new AnnotationConfiguration().configure("artista/hibernate.cfg.xml").buildSessionFactory();
			Session session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			
			Artista a = new Artista();
			a.setNome("um artista");
			session.save(a);
					
			session.getTransaction().commit();			
			session.close();
			
			System.out.println("Não houve erros!");
		}catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

}

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
		<property name="connection.url">url</property>
		<property name="connection.username">usuario</property>
		<property name="connection.password">senha</property>

		<property name="connection.pool_size">1</property>
		<property name="dialect">org.hibernate.dialect.Oracle9iDialect</property>
		<property name="current_session_context_class">thread</property>

		<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
		<property name="show_sql">true</property>
				
		<mapping class="artista.Artista"/>
		<mapping class="artista.Musica"/>		
	</session-factory>
</hibernate-configuration>

[color=red] Unknown entity: artista.Artista[/color]

Aparentemente está correto.

Não deve ter relação, mas eu uso “hibernate.” antes do nome das propriedades.
Ex.:

        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

Tente colocar o hibernate.cfg.xml na pasta src do projeto.

Se não resolver, poste a sua classe que gera as bases junto com o stacktrace.

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Unknown entity: artista.Artista