Pessoal, criei um ID personalizado pra minha entidade, mas o seguinte erro é lançado ao tentar inserir pelo JPA:
org.hibernate.PersistentObjectException: detached entity passed to persist: br.unb.pessoal.model.sipes.DadosFuncionais
Segue declarações:
Entidade:
public class DadosFuncionais implements Serializable {
private static final long serialVersionUID = -288176893648980290L;
@Id
@GenericGenerator(name = "gerador_matricula", strategy = "br.unb.pessoal.infra.sipes.DadosFuncionaisIDGenerator")
@GeneratedValue(generator = "gerador_matricula")
@Column(name = "MatSipes", unique = true, nullable = false, insertable = true)
private Integer matSipes;
Gerador:
public class DadosFuncionaisIDGenerator implements IdentifierGenerator {
@Override
public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
return this.gerarMatSipes();
}
/**
* Gera a nova matrícula FUB para o servidor.
*
* @return Nova Matrícula FUB.
*/
private Integer gerarMatSipes() {
Integer ultimaMatricula = PessoalInfra.getInstance().getDadosFuncionaisRepository().getUltimaMatricula();
int matTemp = 0;
if (ultimaMatricula != null) {
matTemp = ((ultimaMatricula / 10) + 1);
}
return Integer.parseInt(this.calcularNovaMatricula(matTemp));
}
/**
* Realiza o cálculo da nova Matrícula FUB. Este método reflete a 'Function'
* CDC da 'FubLibs' implementada no VB. <br/>
* <p>
* Recebe como parâmetro a última matrícula armazenda no banco de dados,
* dividida por 10 e somada uma unidade (+1). Por receber um inteiro, o
* valor passado como parâmetro é arredondado para baixo antes da
* soma.</p><br/>
*
* @param ultimaMatricula Última matrícula, dividida por 10, arredondada
* para baixo e somada em uma unidade (+1).
* @return Nova matrícula FUB preenchida com zeros à esquerda, caso
* necessário.
*/
private String calcularNovaMatricula(int ultimaMatricula) {
String auxiliar = String.valueOf(ultimaMatricula).trim();
int qtd = auxiliar.length();
int fim = qtd;
int nro = 0;
for (int i = 1; i < fim; i++) {
nro = nro + (qtd + 1) * Integer.parseInt(auxiliar.substring(i, i + 1));
qtd--;
}
Double novaMatricula = (11 - (nro % 11)) % 10 + (Double.valueOf(auxiliar) * 10);
return UtilitariosUnB.aplicarZerosAEsquerda(String.valueOf(novaMatricula.intValue()), fim + 1);
}
}
Método da persistência:
public DadosFuncionais inserir(DadosFuncionais df) {
try {
if (df != null) {
this.getEntityManager().persist(df);
this.getEntityManager().flush();
this.getEntityManager().clear();
DadosFuncionais dadosFuncionais = this.findByCodigoPessoa(df.getPesCodigoPessoa());
if (dadosFuncionais != null) {
return dadosFuncionais;
}
}
} catch (Exception e) {
throw e;
}
return null;
}
Sei que se eu adicionar um auto-incremento no banco esse problema seria resolvido, mas atualmente não é possível criar um campo chave auto-incremento no banco de dados, pois trata-se de uma aplicação para substituir um sistema legado (em VB) que ainda está em uso, estamos migrando alguns módulos, estou tentando replicar o código no Java, mas esbarrei nesse problema (dentre outros).
Desde já agradeço a ajuda!