Analisando passo a passo pelo debug, o objeto arquivoImagem , está preenchido.
Mapeamento pai para filho:
@NotAudited
@OneToMany(mappedBy = "contaPagarReceber", cascade = {CascadeType.PERSIST,
CascadeType.MERGE, CascadeType.DETACH})
public Set<ContaPagarReceberArquivoImagemEntity> getContasPagarReceberArquivosImagens() {
return contasPagarReceberArquivosImagens;
}
Preeenchimento
Set<ContaPagarReceberArquivoImagemEntity> cprai = new LinkedHashSet<>();
for (ContaPagarReceberArquivoImagemEntity arqImg : entidade.getContasPagarReceberArquivosImagens()) {
aplicacaoAuditoria(arqImg);
if(entidadeGravar instanceof ContaPagarEntity){
arqImg.setContaPagarReceber((ContaPagarEntity) entidadeGravar);
} else {
arqImg.setContaPagarReceber((ContaReceberEntity) entidadeGravar);
}
arqImg.setArquivoImagem(arqImg.getArquivoImagem());
cprai.add(arqImg);
}
entidadeGravar.setContasPagarReceberArquivosImagens(cprai);
Método genérico de persist
private void persist(Object objeto) throws Exception {
EntityManager em = JPAUtility.getEntityManager();
try {
EntityTransaction et = em.getTransaction();
try {
((Session) em.getDelegate()).setDefaultReadOnly(false);
et.begin();
em.detach(objeto);
em.persist(objeto);
em.flush();
et.commit();
} catch (PersistenceException e) {
trataErrosDePersistenciaAntes(em, e);
et.rollback();
} catch (Exception e) {
et.rollback();
throw new RuntimeExceptionDao(e);
} finally {
((Session) em.getDelegate()).setDefaultReadOnly(true);
}
} finally {
em.close();
}
}
Erro :
08:26:42,119 WARN [org.hibernate.action.internal.UnresolvedEntityInsertActions] (default task-16) HHH000437: Attempting to save one or more entities that have a non-nullable association with an unsaved transient entity. The unsaved transient entity must be saved in an operation prior to saving these dependent entities.
Unsaved transient entity: ([br.eti.netsoft.erp.modelo.arquivoimagem.ArquivoImagemEntity#<null>])
Dependent entities: ([[br.eti.netsoft.erp.modelo.financeiro.ContaPagarReceberArquivoImagemEntity#511c085f-165f-4438-a3ce-e4fe1a1d3c05]])
Non-nullable association(s): ([br.eti.netsoft.erp.modelo.financeiro.ContaPagarReceberArquivoImagemEntity.arquivoImagem])
08:26:42,119 WARN [org.hibernate.action.internal.UnresolvedEntityInsertActions] (default task-16) HHH000437: Attempting to save one or more entities that have a non-nullable association with an unsaved transient entity. The unsaved transient entity must be saved in an operation prior to saving these dependent entities.
Unsaved transient entity: ([br.eti.netsoft.erp.modelo.arquivoimagem.ArquivoImagemEntity#<null>])
Dependent entities: ([[br.eti.netsoft.erp.modelo.financeiro.ContaPagarReceberArquivoImagemEntity#151decc8-73cb-4b8b-a278-35c2bfd08902]])
Non-nullable association(s): ([br.eti.netsoft.erp.modelo.financeiro.ContaPagarReceberArquivoImagemEntity.arquivoImagem])
08:26:42,120 ERROR [br.eti.netsoft.dao.GHDAO] (default task-16) Erro ao gravar objeto: br.eti.netsoft.dao.exception.RuntimeExceptionDao: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : br.eti.netsoft.erp.modelo.financeiro.ContaPagarReceberArquivoImagemEntity.arquivoImagem -> br.eti.netsoft.erp.modelo.arquivoimagem.ArquivoImagemEntity
O que pode ser este erro ?
Como é a estratégia de obter id da classe ArquivoImagemEntity
?
Gerado automaticamente pelo banco de dados, um GUID
Pelo erro, você deve está tentando salvar um valor valor inválido em uma coluna not null (provavelmente um valor nulo).
Nesta classe: ContaPagarReceberArquivoImagemEntity ?
Não, o erro se refere ao fato de:
Ele estár inserindo um objeto em que ao menos um atributo é um objeto e esse objeto ainda não foi persistido
Ele estar atualizando um objeto que tenha uma lista e ao menos um elemento desta lista é novo.
Ele estar adicionando um objeto que tenha uma lista e esta lista possui elementos não salvos.
Ou seja. ele precisa salvar todos os atributos do objeto ou, no caso de coleção, os elementos da coleção.
Provavelmente, o mapeamento que ele está usando não contém a propriedade CASCADE.
O pior eh que tem um cascade. Bom, talvez esteja configurado errado.
guilhermebhte:
@OneToMany (mappedBy = “contaPagarReceber”, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH}) public Set<ContaPagarReceberArquivoImagemEntity> getContasPagarReceberArquivosImagens() {
guilhermebhte:
08:26:42,120 ERROR [br.eti.netsoft.dao.GHDAO] (default task-16) Erro ao gravar objeto: br.eti.netsoft.dao.exception.RuntimeExceptionDao: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : br.eti.netsoft.erp.modelo.financeiro.ContaPagarReceberArquivoImagemEntity.arquivoImagem -> br.eti.netsoft.erp.modelo.arquivoimagem.ArquivoImagemEntity
Parece que o erro se refere a outro atributo da classe em questão.
Como teste, coloque um Cascade.ALL
, pra ver o que acontece. =)
Estou inserindo um objeto que tem uma lista de outros objetos, com , cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH})
Vou analisar e vejo se a algum campo que está null
Com apenas estes trechos do código fica difícil ter uma visão maior.
Ainda mais que o erro se refere a um atributo cujo getter deveria ser
getArquivoImagem()
O que é diferente do que você apresentou aí, não é mesmo?
Isto é uma lista de imagens para uma contas
Cara, posta a classe ContaPagarReceberArquivoImagemEntity
completa
package br.eti.netsoft.erp.modelo.financeiro;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.envers.AuditOverride;
import org.hibernate.envers.Audited;
import org.hibernate.envers.RelationTargetAuditMode;
import br.eti.netsoft.erp.modelo.ErpEntity;
import br.eti.netsoft.erp.modelo.arquivoimagem.ArquivoImagemEntity;
import br.eti.netsoft.modelo.auditoria.AuditableBaseEntity;
import br.eti.netsoft.util.anotacao.ExclusaoLogica;
/**
* @description Modelo para arquivos ou imagems para a contas pagar ou receber
* @author GH SISTEMAS
*/
@Entity
@Table(name = "TB_CON_PAG_REC_IMG_ARQ", schema = "FINANCEIROS", indexes = {
@Index(columnList = "ST_REGISTRO", name = "I1_CON_PAG_REC_IMG_ARQ"),
@Index(columnList = "FK_CONTA_PAGAR_RECEBER", name = "I2_CON_PAG_REC_IMG_ARQ"),
@Index(columnList = "FK_ARQUIVO_IMAGEM", name = "I3_CON_PAG_REC_IMG_ARQ")})
@Audited
@AuditOverride(forClass = AuditableBaseEntity.class)
@ExclusaoLogica
public class ContaPagarReceberArquivoImagemEntity extends ErpEntity {
private static final long serialVersionUID = -7273641592040911533L;
private ContaPagarReceberEntity contaPagarReceber;
private ArquivoImagemEntity arquivoImagem;
@Id
@Override
@Column(name = "PK_CON_PAG_REC_IMG_ARQ")
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
public String getId() {
return super.getId();
}
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne(targetEntity = ContaPagarReceberEntity.class)
@JoinColumn(name = "FK_CONTA_PAGAR_RECEBER", nullable = false)
public ContaPagarReceberEntity getContaPagarReceber() {
return contaPagarReceber;
}
public void setContaPagarReceber(ContaPagarReceberEntity contaPagarReceber) {
this.contaPagarReceber = contaPagarReceber;
}
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne(targetEntity = ArquivoImagemEntity.class)
@JoinColumn(name = "FK_ARQUIVO_IMAGEM", nullable = false)
public ArquivoImagemEntity getArquivoImagem() {
return arquivoImagem;
}
public void setArquivoImagem(ArquivoImagemEntity arquivoImagem) {
this.arquivoImagem = arquivoImagem;
}
}
package br.eti.netsoft.erp.modelo.financeiro;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.envers.AuditOverride;
import org.hibernate.envers.Audited;
import org.hibernate.envers.RelationTargetAuditMode;
import br.eti.netsoft.erp.modelo.ErpEntity;
import br.eti.netsoft.erp.modelo.arquivoimagem.ArquivoImagemEntity;
import br.eti.netsoft.modelo.auditoria.AuditableBaseEntity;
import br.eti.netsoft.util.anotacao.ExclusaoLogica;
/**
* @description Modelo para arquivos ou imagems para a contas pagar ou receber
* @author GH SISTEMAS
*/
@Entity
@Table(name = "TB_CON_PAG_REC_IMG_ARQ", schema = "FINANCEIROS", indexes = {
@Index(columnList = "ST_REGISTRO", name = "I1_CON_PAG_REC_IMG_ARQ"),
@Index(columnList = "FK_CONTA_PAGAR_RECEBER", name = "I2_CON_PAG_REC_IMG_ARQ"),
@Index(columnList = "FK_ARQUIVO_IMAGEM", name = "I3_CON_PAG_REC_IMG_ARQ")})
@Audited
@AuditOverride(forClass = AuditableBaseEntity.class)
@ExclusaoLogica
public class ContaPagarReceberArquivoImagemEntity extends ErpEntity {
private static final long serialVersionUID = -7273641592040911533L;
private ContaPagarReceberEntity contaPagarReceber;
private ArquivoImagemEntity arquivoImagem;
@Id
@Override
@Column(name = "PK_CON_PAG_REC_IMG_ARQ")
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
public String getId() {
return super.getId();
}
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne(targetEntity = ContaPagarReceberEntity.class)
@JoinColumn(name = "FK_CONTA_PAGAR_RECEBER", nullable = false)
public ContaPagarReceberEntity getContaPagarReceber() {
return contaPagarReceber;
}
public void setContaPagarReceber(ContaPagarReceberEntity contaPagarReceber) {
this.contaPagarReceber = contaPagarReceber;
}
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne(targetEntity = ArquivoImagemEntity.class)
@JoinColumn(name = "FK_ARQUIVO_IMAGEM", nullable = false)
public ArquivoImagemEntity getArquivoImagem() {
return arquivoImagem;
}
public void setArquivoImagem(ArquivoImagemEntity arquivoImagem) {
this.arquivoImagem = arquivoImagem;
}
}
package br.eti.netsoft.erp.modelo.financeiro;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.envers.AuditOverride;
import org.hibernate.envers.Audited;
import org.hibernate.envers.RelationTargetAuditMode;
import br.eti.netsoft.erp.modelo.ErpEntity;
import br.eti.netsoft.erp.modelo.arquivoimagem.ArquivoImagemEntity;
import br.eti.netsoft.modelo.auditoria.AuditableBaseEntity;
import br.eti.netsoft.util.anotacao.ExclusaoLogica;
/**
* @description Modelo para arquivos ou imagems para a contas pagar ou receber
* @author GH SISTEMAS
*/
@Entity
@Table(name = "TB_CON_PAG_REC_IMG_ARQ", schema = "FINANCEIROS", indexes = {
@Index(columnList = "ST_REGISTRO", name = "I1_CON_PAG_REC_IMG_ARQ"),
@Index(columnList = "FK_CONTA_PAGAR_RECEBER", name = "I2_CON_PAG_REC_IMG_ARQ"),
@Index(columnList = "FK_ARQUIVO_IMAGEM", name = "I3_CON_PAG_REC_IMG_ARQ")})
@Audited
@AuditOverride(forClass = AuditableBaseEntity.class)
@ExclusaoLogica
public class ContaPagarReceberArquivoImagemEntity extends ErpEntity {
private static final long serialVersionUID = -7273641592040911533L;
private ContaPagarReceberEntity contaPagarReceber;
private ArquivoImagemEntity arquivoImagem;
@Id
@Override
@Column(name = "PK_CON_PAG_REC_IMG_ARQ")
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
public String getId() {
return super.getId();
}
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne(targetEntity = ContaPagarReceberEntity.class)
@JoinColumn(name = "FK_CONTA_PAGAR_RECEBER", nullable = false)
public ContaPagarReceberEntity getContaPagarReceber() {
return contaPagarReceber;
}
public void setContaPagarReceber(ContaPagarReceberEntity contaPagarReceber) {
this.contaPagarReceber = contaPagarReceber;
}
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne(targetEntity = ArquivoImagemEntity.class)
@JoinColumn(name = "FK_ARQUIVO_IMAGEM", nullable = false)
public ArquivoImagemEntity getArquivoImagem() {
return arquivoImagem;
}
public void setArquivoImagem(ArquivoImagemEntity arquivoImagem) {
this.arquivoImagem = arquivoImagem;
}
}
Aqui você não tem o cascade.
P.S.: Não gosto de usar anotações nos getters, fico perdido vendo esse código amontoado.
2 curtidas
É mesmo. Acho que o problema é este, correto ?
Vou testar e informo aqui.