Hibernate Mapeamento de Classes - Um Contato possui muitos Telefones

Saudações!
Bem, estou começando no mundo da persistência com Hibernate e, naturalmente, estão pintando muitas dúvidas. Segui o passo a passo do “Hibernate in Action” e não estou conseguindo implementar o mapeamento com annotations ( Associação entre 2 classes ). Além disso, fiquei na dúvida se a classe Phone torna-se campo na tabela referente à classe Contact ou se ela deve ser outra classe. Fiz, considerando a última opção. Está correto? Seguem as minhas classes e o erro:

import java.util.*;

import javax.persistence.*;

import org.hibernate.annotations.Columns;
import org.hibernate.annotations.Type;


@Entity
public class Contact {
	
	@Id 
	@GeneratedValue	
	private Long id;
	private String firstName;
	private String middleName;
	private String lastName;
		
	
	private Collection<Phone> phoneNumbers = new ArrayList<Phone>();
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getFirstName() {
		return firstName;
	}
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
	public String getMiddleName() {
		return middleName;
	}
	public void setMiddleName(String middleName) {
		this.middleName = middleName;
	}
	public String getLastName() {
		return lastName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
		
	
	@OneToMany
	@JoinColumn(name="id_phone")
	public Collection<Phone> getPhoneNumbers() {
		return phoneNumbers;
	}
	public void setPhoneNumbers(Collection<Phone> phoneNumbers) {
		this.phoneNumbers = phoneNumbers;
	}
	
}
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
public class Phone implements java.io.Serializable {
		
	private int id;
	private boolean isCelPhone;	
	private String number;
	
	public Phone(){
		
	}
	
	@Id
	@GeneratedValue
	@Column(name="id_phone")
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public boolean isCelPhone() {
		return isCelPhone;
	}
	public void setCelPhone(boolean isCelPhone) {
		this.isCelPhone = isCelPhone;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}	
	
	
}

ERRO:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.MappingException: Could not determine type for: java.util.Collection, at table: Contact, for columns: [org.hibernate.mapping.Column(phoneNumbers)]
	at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:292)
	at org.hibernate.mapping.Column.getSqlTypeCode(Column.java:161)
	at org.hibernate.mapping.Column.getSqlType(Column.java:205)
	at org.hibernate.mapping.Table.sqlCreateString(Table.java:420)
	at org.hibernate.cfg.Configuration.generateSchemaCreationScript(Configuration.java:881)
	at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:129)
	at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:91)
	at Test.main(Test.java:24)

Alguém sabe o que pode ser?

Obrigado,
Bruno Giminiani.

Acho que vc tem que anotar o atributo e não o método. Mude sua anotação oneToMany para o atributo phoneNumbers…

Eu já havia feito isto, mas dá o mesmo erro.
Segue a classe de teste que acabei esquecendo:

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

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub		
		AnnotationConfiguration cfg;
		cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(Contact.class);
		new SchemaExport(cfg).create(false, true);
		SessionFactory factory = cfg.buildSessionFactory();
		Session s1 = factory.openSession();
		Session s2 = factory.openSession();
				
		Contact contact = new Contact();
		String str;
		str = "teste";
		contact.setFirstName(str.toUpperCase());
		contact.setMiddleName("MACEDO");
		
		str = "GIMINMIANI";
		contact.setLastName(str.toLowerCase());
		
		
		Phone phone;
		phone = new Phone();
		phone.setCelPhone(false);
		phone.setNumber("1111-4444");
		contact.getPhoneNumbers().add(phone);		
		phone.setCelPhone(true);
		phone.setNumber("4444-1111");
		contact.getPhoneNumbers().add(phone);		
			
		
		
		s1.save(contact);
		System.out.println("o contato "+contact.getLastName()+" de id "+contact.getId()+" foi salvo com sucesso!");
		str = "bruno";
		contact.setFirstName(str.toUpperCase());
		contact.setMiddleName("MACEDO");
		str = "GIMINMIANI";
		contact.setLastName(str.toLowerCase());
		//group.setName("TRABALHO");
		s2.save(contact);
		System.out.println("o contato "+contact.getLastName()+" de id "+contact.getId()+" foi salvo com sucesso!");
		
		s1.close();
		s2.clear();
		factory.close();
		
		
		
	}

Dei uma olhada na exceção e parece que ele não está reconhecendo a Classe Collection. Mas nunca tive esse erro, então vamos ver se alguém responde…

Vc está fazendo um mapeamento bidirecional, com isso, o seu atributo Phone da classe Contact precisa ser mapeada - @OneToMany - e sua classe Phone precisa de um Contact contact mapeado como @ManyToOne… Na annotation @Join vc precisa de um atributo mappedBy() que direciona para a instacia de contact da classe Phone.

Dá uma olhada na net sobre relacionamento bidirecional caso vc não tenha solucionado o problema…