Boa tarde,
Gostaria de criar um Objeto no Hibernate e depois de saber qual o tipo de filho que ele é, poder mudar o tipo de objeto persistido, mantendo os dados iniciais.
Gostaria de saber como eu faço para renomear um objeto de um superclasse como uma subclasse.
Os métodos salvar abaixo dentro do managedBean chama o método em.persist(objeto);
Imagine que eu tenha os seguintes objetos:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Usuario {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String login;
private String senha;
}
@Entity
public class Cliente extends Usuario {
private Double valorRecebido;
//getters and setters
}
@Entity
public class Funcionario extends Usuario {private Short valorPago;
//getters and setters
}
Uma pessoa qualquer entra no meu site e clica para fazer um novo usuario.
Imagine que não tem como ela saber se será sempre um funcionário ou cliente, mesmo que seja naquele momento, então não tem sentido ela já escolher um dos dois e nunca mais poder mudar.
Como estou usando JSF, eu vou no meu managedBean referente a minha tela e utilizo o metodo salvar
@Named @RequestScoped
public class UsuarioBean {
private Usuario usuario = new Usuario();
@Inject
UsuarioDao usuarioDao;
@Transactional
public void salvar() {
usuarioDao.salvar(usuario);
}
}
Em uma próxima tela, o usuário já sabe o que será da vida e escolhe ser um dos dois.
Eu crio dois métodos e chamo pela tela o que tiver sido escolhido:
public class EscolhaDificilBean {
@Inject
FuncionarioDao funcionarioDao;
@Inject
ClienteDao clienteDao;
@Transactional
public void salvarFuncionario() {
Funcionario funcionario = new Funcionario(usuario);
funcionarioDao.salvar(funcionario);
}
No construtor Funcionario(usuario) copio todos atributos? Inclusive Id??
Imagino que será criado um novo funcionário totalmente independente do antigo apos o salvar(funcionario)
Se eu copiar também o id resolvo o problema?
@Transactional
public void salvarCliente() {
Cliente cliente = new Cliente(usuario);
clienteDao.salvar(cliente);
}
}
Como seria esse construtor Cliente (usuario) e o que ocorreria na base de dados?
Como resolvo esse problema? E se o usuário for cliente e funcionário???
Obrigado pela ajuda!