Erro de class abstrata

16 respostas
L

Boa tarde galera do GUJ,

Estou com um problema, na verdade é mais uma duvida. Tenho um sistema que estou ajustando, ja estava desenvolvido. Aii esta dando o seguinte erro:

Porem minha duvida é a seguinte. Este sistema roda na base de dados ORACLE e SQL Server 2005. No oracle nao estoura este erro e no sql server sim… aguem poderia me explicar oq esta havendo???

att, :shock:

16 Respostas

D

Sem ver o código a partir do qual a exception é lançada fica meio complicado.
O que pode ocorrer é, devido a configuração do sistema, o hibernate tenta instanciar a classe respectiva ao SQL Server através de reflection, porém, essa classe não é uma classe concreta e sim uma abstract ou uma interface.

H

Parece que foi mapeada uma classe abstrata e/ou interface e o Hibernate está tentando fazer um new nesse cara.

L

Olá drsmachado,

Entao tennho o metodo:

public List<Pessoa> findPessoasCadastradas(Pessoa entity) throws BusinessException, ValidateException {
		try {
			logger.debug("Pesquisar cadastros: " + entity);

			List<Pessoa> pessoas = liberarAcessoRepo.findPessoasCadastradas(entity);

			return pessoas;
		} catch (RepositoryException e) {
			throw new BusinessException(e.getMessage(), e);
		}
	}

A classe Pessoa:

@Entity
@Table(name = "TB_PESSOA", schema = DataAccessLayerConstants.CAMBIO_SCHEMA)
@Inheritance(strategy = InheritanceType.JOINED)
@TableGenerator(name = "idGenerator", table = "TB_SEQUENCE", allocationSize = 1, pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "SEQ_PESSOA")
public abstract class Pessoa implements EntityObject {

...

}
H

Pq sua classe é abstrata?

Tem alguém herdando?

Se sim, faça o find em cima da classe que herda, se não, retire o abstract da classe.

L

Aii tenho 2 classes que extendem dela… pessoa fisica e pessoa juridica… mas como é um sistema grande nao sei como alterar sem quebrar o codigo … aidna pq este sistema esta em producao em uma empresa… :cry: :cry:

H

Então ao invés de fazer a consulta esperando Pessoa, faça em cima do PJ ou PF.

L

Ate aii é tranquilo… mas ainda sim nao entendo como funciona no oracle e no sql nao???

D

Creio que o problema não esteja diretamente ali, posta o código do método liberarAcessoRepo.findPessoasCadastradas(entity);
para vermos qual objeto faz o cast.

L

Cara esse codigo é grande…

public List<Pessoa> findPessoasCadastradas(Pessoa entity) throws RepositoryException {
		List<Pessoa> entityList = null;
		try {
			if (logger.isDebugEnabled()) {
				logger.debug("Pesquisando a entidade: " + entity);
			}

			StringBuilder sql = new StringBuilder("SELECT e ");
			sql.append("FROM " + Pessoa.class.getSimpleName() + " e ");

			List args = new ArrayList();

			PessoaFisica pf = null;
			PessoaJuridica pj = null;

			if (entity == null) {
				sql.append("WHERE e.interna = ?");
				args.add(false);
			} else {
				// Verifica se objeto é um Pessoa Física para montar as querys de consulta
				if (PessoaFisica.class.equals(entity.getClass())) {
					pf = (PessoaFisica) entity;

					if (pf.getCpf() == null && pf.getNomeRazaoSocial() == null || pf.getCpf().equals("") && pf.getNomeRazaoSocial().equals("")) {
						sql.append("WHERE e.interna = ?");
						sql.append("AND e.tipo = ?");
						args.add(false);
						args.add(TipoPessoaEnum.FISICA);
					} else {
						if (pf.getCpf() == null && pf.getNomeRazaoSocial() != null || pf.getCpf().equals("") && !pf.getNomeRazaoSocial().equals("")) {
							sql.append("WHERE e.interna = ?");
							sql.append("AND e.nomeRazaoSocial like ? ");
							sql.append("AND e.tipo = ?");
							args.add(false);
							args.add("%" + entity.getNomeRazaoSocial() + "%");
							args.add(TipoPessoaEnum.FISICA);
						} else {
							if (pf.getCpf() != null && pf.getNomeRazaoSocial() == null || !pf.getCpf().equals("") && pf.getNomeRazaoSocial().equals("")) {
								sql.append("WHERE e.interna = ?");
								sql.append("AND e.cpf like ? ");
								sql.append("AND e.tipo = ?");
								args.add(false);
								args.add("%" + pf.getCpf() + "%");
								args.add(TipoPessoaEnum.FISICA);
							} else {
								sql.append("WHERE e.interna = ?");
								sql.append("AND e.cpf like ? ");
								sql.append("AND e.nomeRazaoSocial like ? ");
								sql.append("AND e.tipo = ? ");
								args.add(false);
								args.add("%" + pf.getCpf() + "%");
								args.add("%" + entity.getNomeRazaoSocial() + "%");
								args.add(TipoPessoaEnum.FISICA);
							}
						}
					}
				} else {
					// Verifica se objeto é um Pessoa Jurídica para montar as querys de consulta
					if (PessoaJuridica.class.equals(entity.getClass())) {
						pj = (PessoaJuridica) entity;

						if (pj.getCnpj() == null && pj.getNomeRazaoSocial() == null || pj.getCnpj().equals("") && pj.getNomeRazaoSocial().equals("")) {
							sql.append("WHERE e.interna = ?");
							sql.append("AND e.tipo = ?");
							args.add(false);
							args.add(TipoPessoaEnum.JURIDICA);
						} else {
							if (pj.getCnpj() == null && pj.getNomeRazaoSocial() != null || pj.getCnpj().equals("") && !pj.getNomeRazaoSocial().equals("")) {
								sql.append("WHERE e.interna = ?");
								sql.append("AND e.nomeRazaoSocial like ? ");
								sql.append("AND e.tipo = ?");
								args.add(false);
								args.add("%" + entity.getNomeRazaoSocial() + "%");
								args.add(TipoPessoaEnum.JURIDICA);
							} else {
								if (pj.getCnpj() != null && pj.getNomeRazaoSocial() == null || !pj.getCnpj().equals("") && pj.getNomeRazaoSocial().equals("")) {
									sql.append("WHERE e.interna = ?");
									sql.append("AND e.cnpj like ? ");
									sql.append("AND e.tipo = ?");
									args.add(false);
									args.add("%" + pj.getCnpj() + "%");
									args.add(TipoPessoaEnum.JURIDICA);
								} else {
									sql.append("WHERE e.interna = ?");
									sql.append("AND e.cnpj like ? ");
									sql.append("AND e.nomeRazaoSocial like ? ");
									sql.append("AND e.tipo = ? ");
									args.add(false);
									args.add("%" + pj.getCnpj() + "%");
									args.add("%" + entity.getNomeRazaoSocial() + "%");
									args.add(TipoPessoaEnum.JURIDICA);
								}
							}
						}
					}
				}
			}

			sql.append(" ORDER BY e.nomeRazaoSocial ");
			Object params[] = args.toArray();
			Query query = getEntityManager().createQuery(sql.toString());
			if (params != null) {
				for (int i = 0; i < params.length; i++) {
					query.setParameter(i + 1, params[i]);
				}
			}

			entityList = new ArrayList<Pessoa>(query.getResultList());

			// inicializa a coleção de emails para não dar lazyIniatializeException
			for (Pessoa pessoa : entityList) {
				Hibernate.initialize(pessoa.getEmails());
				Hibernate.initialize(pessoa.getTelefones());
				Hibernate.initialize(pessoa.getEnderecos());
			}

			return entityList;
		} catch (Throwable e) {
			logger.error(e.getMessage());
			throw new RepositoryException("Erro na persistência de informações", e);
		}
	}
H

Issé mesmo.

Posta o método que o drsmachado pra gente continuar olhando. [=

H

Se vc debugar, o erro aparece em que linha?

M

esse erro está bem estranho…

usar a lista de pessoa pra guardar o retorno do método não é pra dar problema porque ele usa polimorfismo.

tais testando o mesmo fonte para testar as 2 bases?

se nao, confirma se a versão do sistema usando oracle é a mesma do sql server.

L

Olá MaYaRa_SaN,

Sim é a mesma versao, mudando apenas as bases de dados, as configuracoes devidas… pq é especifico de cada empresa…

H

Realmente a versão de um poderia estar diferente do outro.

L

Bom a versao é a mesma tenho certeza… bom vou ver aki oq posso fazer… mas vlw gente pela ajuda… :wink:

D

liviaguedes, existe uma annotation @ForceDiscriminator, que poderia auxiliar.
Créditos http://stackoverflow.com/questions/5237009/jpa-onetoone-throws-error-when-mapped-to-an-abstract-entity-with-subclasses

Outra possibildiade seria @MappedSuperclass, que é citada aqui http://forum.springsource.org/showthread.php?110098-DAO-for-abstract-class-Cannot-instantiate-abstract-class-or-interface

Criado 27 de dezembro de 2011
Ultima resposta 27 de dez. de 2011
Respostas 16
Participantes 4