Cannot be cast to java.util.Collection

Pessoal, o que quer dizer o seguinte erro?

Exception in thread “main” java.lang.ClassCastException: br.gov.mdic.servlet.Funcionario cannot be cast to java.util.Collection
at br.gov.mdic.servlet.Empresa.setResponsavel(Empresa.java:84)
at br.gov.mdic.servlet.CriaTabelas.main(CriaTabelas.java:40)

Poste o código completo!

Classe que cria a tabela:

@WebServlet("/criatabelas")
public class CriaTabelas extends HttpServlet  {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public static void main ( String [] args ) {
		
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("HXBR");
		EntityManager em = emf.createEntityManager();
		
        Empresa empresa = new Empresa();
        Funcionario responsavel = new Funcionario();
        empresa.setNomeFantasia("Heli");
        empresa.setRazaoSocial("do Brasil");
        empresa.setCNPJ("20.387.3330001-81");
        empresa.setWebsite("www.emb.com.br");
        //empresa.setFundacao();
        

        responsavel.setEmail("leans@gmail.com");
        responsavel.setCargo("Analista");
        responsavel.setCelular("9988-0813");
        responsavel.setDepartamento("Indústrias para Mobilidade");
        responsavel.setEmpresa(empresa);
        responsavel.setNome("Leonardo");
        responsavel.setTelefone("9988-0813");
        
        empresa.setResponsavel(responsavel);
       

        em.getTransaction().begin();
        em.persist(empresa);
        em.persist(responsavel);
        em.getTransaction().commit();

        System.out.println("Empresa salva com sucesso!");	
}
}

Código da Classe Empresa:

@Entity
public class Empresa implements Serializable {
	
	private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
protected Long id;
private String RazaoSocial;
private String NomeFantasia;
private String Website;
private String CNPJ;

@OneToMany
protected Collection<Funcionario> Responsavel;

@OneToMany
private Collection<Endereco> Matriz;

@Temporal(TemporalType.DATE)
private Date Fundacao;



public Long getId() {
	return id;
}

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

public String getRazaoSocial(){
	return RazaoSocial;
}

public void setRazaoSocial(String RazaoSocial){
	this.RazaoSocial = RazaoSocial;
}

public String getNomefantasia(){
	return NomeFantasia;
}

public void setNomeFantasia(String NomeFantasia){
	this.NomeFantasia = NomeFantasia;
}

public String getWebsite(){
	return Website;
}

public void setWebsite(String Website){
	this.Website = Website;
}

public String getCNPJ(){
	return CNPJ;
}

public void setCNPJ(String CNPJ){
	this.CNPJ = CNPJ;
}

public Funcionario getResponsavel(){
	return (Funcionario) Responsavel;
}

@SuppressWarnings("unchecked")
public void setResponsavel(Funcionario Responsavel){
	this.Responsavel = (Collection<Funcionario>) Responsavel;
	
}

public Endereco getMatriz(){
	return (Endereco) Matriz;
}

@SuppressWarnings("unchecked")
public void setMatriz(Endereco Matriz){
	this.Matriz= (Collection<Endereco>) Matriz;
}

public Date getFundacao(){
	return Fundacao;
}

public void setFundacao(Date Fundacao){
	this.Fundacao = Fundacao;
}

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((CNPJ == null) ? 0 : CNPJ.hashCode());
	result = prime * result + ((Fundacao == null) ? 0 : Fundacao.hashCode());
	result = prime * result + ((Matriz == null) ? 0 : Matriz.hashCode());
	result = prime * result + ((NomeFantasia == null) ? 0 : NomeFantasia.hashCode());
	result = prime * result + ((RazaoSocial == null) ? 0 : RazaoSocial.hashCode());
	result = prime * result + ((Responsavel == null) ? 0 : Responsavel.hashCode());
	result = prime * result + ((Website == null) ? 0 : Website.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;
	Empresa other = (Empresa) obj;
	if (CNPJ == null) {
		if (other.CNPJ != null)
			return false;
	} else if (!CNPJ.equals(other.CNPJ))
		return false;
	if (Fundacao == null) {
		if (other.Fundacao != null)
			return false;
	} else if (!Fundacao.equals(other.Fundacao))
		return false;
	if (Matriz == null) {
		if (other.Matriz != null)
			return false;
	} else if (!Matriz.equals(other.Matriz))
		return false;
	if (NomeFantasia == null) {
		if (other.NomeFantasia != null)
			return false;
	} else if (!NomeFantasia.equals(other.NomeFantasia))
		return false;
	if (RazaoSocial == null) {
		if (other.RazaoSocial != null)
			return false;
	} else if (!RazaoSocial.equals(other.RazaoSocial))
		return false;
	if (Responsavel == null) {
		if (other.Responsavel != null)
			return false;
	} else if (!Responsavel.equals(other.Responsavel))
		return false;
	if (Website == null) {
		if (other.Website != null)
			return false;
	} else if (!Website.equals(other.Website))
		return false;
	return true;
}


}

Classe de Funcionário:

@Entity
public class Funcionario implements Serializable {

	protected static final long serialVersionUID = 1L;

@Id
@GeneratedValue
protected Long id;
protected String Nome;
protected String Email;

@Lob
protected byte[] avatar;

protected String Departamento;
protected String Telefone;
protected String Celular;
protected String Cargo;

@ManyToOne
protected Empresa empresa;


public Long getId() {
	return id;
}

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

public String getNome(){
	return Nome;
}

public void setNome(String Nome){
	this.Nome = Nome;
}

public String getEmail(){
	return Email;
}

public void setEmail(String Email){
	this.Email = Email;
}

public String getDepartamento(){
	return Departamento;
}

public void setDepartamento(String Departamento){
	this.Departamento = Departamento;
}

public String getTelefone(){
	return Telefone;
}

public void setTelefone(String Telefone){
	this.Telefone = Telefone;
}

public String getCelular(){
	return Celular;
}

public void setCelular(String Celular){
	this.Celular = Celular;
}

public String getCargo(){
	return Cargo;
}

public void setCargo(String Cargo){
	this.Cargo = Cargo;
}

public Empresa getEmpresa() {
	return empresa;
}

public void setEmpresa(Empresa empresa) {
	this.empresa = empresa;
}

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((Cargo == null) ? 0 : Cargo.hashCode());
	result = prime * result + ((Celular == null) ? 0 : Celular.hashCode());
	result = prime * result + ((Departamento == null) ? 0 : Departamento.hashCode());
	result = prime * result + ((Email == null) ? 0 : Email.hashCode());
	result = prime * result + ((Nome == null) ? 0 : Nome.hashCode());
	result = prime * result + ((Telefone == null) ? 0 : Telefone.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;
	Funcionario other = (Funcionario) obj;
	if (Cargo == null) {
		if (other.Cargo != null)
			return false;
	} else if (!Cargo.equals(other.Cargo))
		return false;
	if (Celular == null) {
		if (other.Celular != null)
			return false;
	} else if (!Celular.equals(other.Celular))
		return false;
	if (Departamento == null) {
		if (other.Departamento != null)
			return false;
	} else if (!Departamento.equals(other.Departamento))
		return false;
	if (Email == null) {
		if (other.Email != null)
			return false;
	} else if (!Email.equals(other.Email))
		return false;
	if (Nome == null) {
		if (other.Nome != null)
			return false;
	} else if (!Nome.equals(other.Nome))
		return false;
	if (Telefone == null) {
		if (other.Telefone != null)
			return false;
	} else if (!Telefone.equals(other.Telefone))
		return false;
	return true;
}
}

Não sei como resolver, mas acho que o problema está em:

empresa.setResponsavel(responsavel);

Porque sempre que eu apago ele, o código roda direito e é gravado no banco.

O erro quer dizer que você está tentando converter um objeto do tipo Funcionario em um objeto do tipo Collection. Eu imagino que um Funcionario não seja um Collection (ou seja que não implemente essa interface que serve para implementar listas de objetos).

Mas é uma relação OnetoMany. Não deveria ser uma coleção Funcionário?

public Funcionario getResponsavel(){
	return (Funcionario) Responsavel;
}

@SuppressWarnings("unchecked")
public void setResponsavel(Funcionario Responsavel){
	this.Responsavel = (Collection<Funcionario>) Responsavel;
	
}

Teu erro está no código acima… Antes de aprender JPA você precisa aprender o que é um tipo de dados e como funciona a coerção de tipos (type casting) no Java.

No método get você faz a coerção da variável Responsavel para Funcionario e no método set faz a coerção do argumento do tipo Funcionario para Collection de Funcionario. Não rola!! Não dá para enganar a JVM e dizer que Banana é Laranja. Ele vai te xingar…

@esmiralha você está correto. Eu não tenho conhecimento de como funciona a coerção de tipos; mas, como eu não sou da área de programação, eu estou aprendendo Java já na ação, a partir de erros concretos.

Como você sugere que esse erro pode contornado?

Vc pode ter uma lista de funcionários sim, mas quando vc adicionar o responsável no método vc adiciona ele na lista e não faz um cast para que ele seja uma lista

1 curtida

@igomes Obrigado, Igor. Chegando em casa, farei o teste.

Como ficaria a linha de código para adicioná-lo na lista?

Só chamar o método add.
https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html

1 curtida

Valeu!