Dúvida em Cast

Bom dia pessoal!

Estou migrando informações de uma base de dados antiga e estou meio perdido no que diz respeito a conversão de variáveis de referencia.

Tenho dois tipos de usuários Permissionario e Permissionario Militar e em dado momento preciso converter um permissionario em um permissionario militar.

Nos meus beans PermMilitar é subclasse de Permissionario.

Vou postar todo o método e indicar onde está o erro!

Gostaria que se voces encontrarem coisas estranhas no meu código deixem a crítica.

	public void migrarPermissionarios() {
		AbreConExternas conExternas = new AbreConExternas();
		PreparedStatement pStatement = null;
		ResultSet rSet = null;
		
		try {
			String sql = "SELECT * FROM permissionario";
			pStatement = conExternas.connSisCoP().prepareStatement(sql);
			rSet = pStatement.executeQuery();
			
			Permissionario permissionario = new Permissionario();
			
			
			while(rSet.next()){
				
				if(rSet.getString("nr_identidade").trim().equalsIgnoreCase("SEM IDT") ||
				    rSet.getString("nr_identidade").trim().equalsIgnoreCase("1111111111") ||
				    rSet.getString("nr_identidade").length() > 12) {
					
					outputLog.println(rSet.getString("nr_identidade")+" é inválida. O SisCoP tentará corrigir o erro!");
					
					//Consulta a identidade utilizando o prec_cp para busca
					String consultaIdentificador = "select IDENTIFICADOR_COD from pessoa where PREC_CP = '"+rSet.getString("prec_cp")+"'";
					PreparedStatement psPrecCP = conExternas.connEBCORP().prepareStatement(consultaIdentificador);
					ResultSet rSPrecCP = psPrecCP.executeQuery();
						if (rSPrecCP.next()) {
							//Seta o identificador_cod do servidor civil como nr_identidade
							outputLog.println("Identidade encontrada utilzando o prec_cp do registro!");
							permissionario.setNrIdentidade(rSPrecCP.getString("IDENTIFICADOR_COD"));	
						}else {
							//Consulta a identidade utilizando o nome para busca
							String consultaNome = "select IDENTIFICADOR_COD from pessoa where nome = '"+rSet.getString("nome").trim()+"'";
							PreparedStatement pSNome = conExternas.connEBCORP().prepareStatement(consultaNome);
							ResultSet rSNome = pSNome.executeQuery();
							if(rSNome.next()) {
								outputLog.println("Identidade encontrada utilzando o nome do registro!");
								permissionario.setNrIdentidade(rSNome.getString("IDENTIFICADOR_COD"));
							}else {
								outputLog.println("Identidade não encontrada! O SisCoP criará uma utilzando o nome do registro!");
								int nrIdentidade = 1111111112;
								permissionario.setNrIdentidade(""+nrIdentidade);
								nrIdentidade++;
							}
						}
				}else {
					permissionario.setNrIdentidade(rSet.getString("nr_identidade"));
				}
			
				permissionario.setCpf(rSet.getString("cpf"));
				permissionario.setDeSenha("1234");
				permissionario.setDtCadastro(rSet.getTimestamp("dt_implantacao"));
				permissionario.setDtNascimento(rSet.getDate("dt_nascimento"));
				permissionario.setEmail(rSet.getString("email_perm"));
				permissionario.setFone(rSet.getString("tel_perm"));
				permissionario.setNome(rSet.getString("nome"));
				String codPostoGrad = rSet.getString("pg_cod_posto_grad");
				
				
				Orgao orgao = new Orgao();
				if(rSet.getString("ua_cod_ua") == null || rSet.getString("ua_cod_ua").length() == 0) {
					orgao.setCodOrgao(999999);
				}else{
					orgao.setCodOrgao(Integer.parseInt(rSet.getString("ua_cod_ua")));
				}
				permissionario.setOrgao(orgao);
					
				Perfil perfil = new Perfil();
				perfil.setIdPerfil(6);
				permissionario.setPerfil(perfil);
					
				PermSituacao situacao = new PermSituacao();
				situacao.setIdPermSituacao(mapaSituacaoPerm.get(rSet.getInt("sit_cod_situacao_perm")));
				permissionario.setPermSituacao(situacao);
				
				PermTipo tipo = new PermTipo();
				tipo.setIdPermTipo(1);
				permissionario.setPermTipo(tipo);
				
				
				if(codPostoGrad.equals(88) || codPostoGrad.equals(90)) {
					
					PermissionarioDAO.getInstance().save(permissionario);
				}else {
					PermMilitar militar = new PermMilitar();
					
					militar.setNome(permissionario.getNome());
					militar.setNrIdentidade(permissionario.getNrIdentidade());
					militar.setCpf(permissionario.getCpf());
					militar.setDeSenha(permissionario.getDeSenha());
					militar.setDtCadastro(permissionario.getDtCadastro());
					militar.setDtNascimento(permissionario.getDtNascimento());
					militar.setEmail(permissionario.getEmail());
					militar.setFone(permissionario.getFone());

					militar.setOrgao(permissionario.getOrgao());
					militar.setPerfil(permissionario.getPerfil());
					militar.setPermSituacao(permissionario.getPermSituacao());
  					militar.setPermTipo(permissionario.getPermTipo());
					
					PostoGradEspec postoGradEspec = new PostoGradEspec();
					postoGradEspec.setCodPostoGradEspec(Integer.parseInt(codPostoGrad));
					militar.setPostoGradEspec(postoGradEspec);
					
					QASQMS qas = new QASQMS();
					qas.setCodQASQMS(("5812"));
					militar.setQasQMS(qas);
					
					militar.setNomeGuerra(rSet.getString("nome_guerra"));
					
					PermissionarioDAO.getInstance().save(militar);
					
					// Verifica se militar possuia solicitação de PNR em aberto
					
					if(militar.getPermSituacao().getIdPermSituacao() == 2) {
						SolicitacaoPNR solicitacaoPNR = new SolicitacaoPNR();
						solicitacaoPNR.setPermissionario(militar);
						solicitacaoPNR.setDtApresentacao(rSet.getTimestamp("dt_implantacao"));
						solicitacaoPNR.setDtApresentacao(rSet.getDate("prev_dt_apresentacao"));
						solicitacaoPNR.setDescObservacao(rSet.getString("obs_permissionario"));
						
					}
				}
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		}	
	}

Aqui é onde estou com dúvida. Estou tendo que setar os dados do permissionário um a um para poder funcionar.

gostaria de fazer algo do tipo.

Permissionario perm = new PermMilitar();

perm = permissionario;

PermMilitar militar = (PermMilitar) perm;

e substituir isso:

PermMilitar militar = new PermMilitar();
					
					militar.setNome(permissionario.getNome());
					militar.setNrIdentidade(permissionario.getNrIdentidade());
					militar.setCpf(permissionario.getCpf());
					militar.setDeSenha(permissionario.getDeSenha());
					militar.setDtCadastro(permissionario.getDtCadastro());
					militar.setDtNascimento(permissionario.getDtNascimento());
					militar.setEmail(permissionario.getEmail());
					militar.setFone(permissionario.getFone());

					militar.setOrgao(permissionario.getOrgao());
					militar.setPerfil(permissionario.getPerfil());
					militar.setPermSituacao(permissionario.getPermSituacao());
  					militar.setPermTipo(permissionario.getPermTipo());
					
					PostoGradEspec postoGradEspec = new PostoGradEspec();
					postoGradEspec.setCodPostoGradEspec(Integer.parseInt(codPostoGrad));
					militar.setPostoGradEspec(postoGradEspec);
					
					QASQMS qas = new QASQMS();
					qas.setCodQASQMS(("5812"));
					militar.setQasQMS(qas);
					
					militar.setNomeGuerra(rSet.getString("nome_guerra"));
					
					PermissionarioDAO.getInstance().save(militar);

Aguardo ajuda!

Acredito que o problema ai seja no design. Militar seria um tipo de Permissionário, não?

Isso! Militar herda de Permissionario!

PermMilitar extends Permissionario {}

aguardo!

Quiz dizer que você teria somente uma classe Permissionario, e nela você teria um atributo tipo (String tipo), onde informaria se é militar ou não.

Isso. Tenho o atributo Tipo de Permissionario que são Civil e Militar. Caso seja militar busco o restante das informações como graduação e nome de guerra. Se é civil salvo antes disso. O problema é em converter Permissionario para PermMilitar . . de um objeto mais genérico para um mais específico.

Obrigado!

Certo,

Mas se você tivesse somente uma classe Permissionario (Tanto para Civil quanto para Militar), contendo os dados dos 2 tipos. Você consegue diferenciar somente pelo campo de tipo, não precisando fazer o cast ou ficar setando de um objeto para outro.

Certo, mas tenho informações que somente militares possuem como graduação, nome de guerra, qualificação e resolvi utilizar os princípios da herança e diferenciar o permissionário puro do militar.

Você acha que seria melhor mesmo assim deixar tudo em uma classe só ?