Erro com sequence de chave composta

6 respostas
X

Gente estou com uma duvida
Tenho a minha classe de modelo que possui uma chave primaria com varios campos e por isso criei um compositeId para o meu modelo. No banco a minha chave primaria tem 4 campos e 1 deles é sequencial.
No modelo ficou assim(nao coloquei o modelo todo nao, so o getter do id):

@EmbeddedId
public SequencialArquivoSpedPK getId() {
	return this.id;
}

E no composite id coloquei (nao pus os setters aqui para nao poluir mt.):

/** Número Seqüencial do bloco. */
	private Integer numeroSequencialGrupoBloco;

	/** Lf Empresa Matriz. */
	private IEmpresaMatriz empresaMatriz;

	/** Indica o tipo de layout do arquivo 0-SPED-ECD/1-SPED-FCONT. */
	private String tipoLayout;

	/** Tipo de Registro. */
	private String tipoRegistro;

	@GeneratedValue(generator = "S_SEQ_ARQ_SPED_01")
	@SequenceGenerator(name = "S_SEQ_ARQ_SPED_01", sequenceName = "S_SEQ_ARQ_SPED_01")
	@Column(name = "NUM_SEQ_GRUPO_BLOCO")
	public Integer getNumeroSequencialGrupoBloco() {
		return numeroSequencialGrupoBloco;
	}

	@ManyToOne(targetEntity = br.com.souzacruz.sped.contabil.service.impl.model.EmpresaMatriz.class)
	@JoinColumns({ @JoinColumn(name = "COD_HOLD", referencedColumnName = "COD_HOLDING"),
				   @JoinColumn(name = "COD_MATRIZ", referencedColumnName = "COD_MATRIZ") })
	public IEmpresaMatriz getEmpresaMatriz() {
		return empresaMatriz;
	}

	@Column(name = "TIP_LAYOUT")
	public String getTipoLayout() {
		return tipoLayout;
	}

	@Column(name = "TIP_REGTRO")
	public String getTipoRegistro() {
		return tipoRegistro;

Porém qndo vou salvar o hibernate me retorna o erro:
java.sql.SQLException: ORA-01400: não é possível inserir NULL em (“FINSPED”.“SEQ_ARQ_SPED”.“NUM_SEQ_GRUPO_BLOCO”)

Sendo que esse campo ele nao deveria por default na query e ir adicionando 1 unidade conforme eu salvo no banco?
vlw

6 Respostas

ralphsilver

vc não especificou o strategy no @GeneratedValue:

@GeneratedValue(generator="S_SEQ_ARQ_SPED_01", strategy=GenerationType.SEQUENCE)

e só uma dica: no @SequenceGenerator especifique o atributo allocationSize=1 porque há frameworks que o padrão não é 1 como, por exemplo, o hibernate que aloca de 50 em 50…

X

Cara nao funcionou…
e eu nao entendi esse allocationSize=1 , e que 50 em 50 é esse que o hibernate poe??
vlw

ralphsilver
@SequenceGenerator(name = "S_SEQ_ARQ_SPED_01", sequenceName = "S_SEQ_ARQ_SPED_01",allocationSize=1)

Quero dizer colocar mais esse atributo porque senão a sequence será incrementada de 50 em 50 e não de 1 em 1.

Agora com relação ao EmbeddedId parece que tem alguma coisa errada. Na classe que era pra ser a chave composta há relação entre entidades… posta as duas classes inteiras pra gente ver o que vc arrumou aí…

X
package br.com.souzacruz.sped.contabil.service.impl.model;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;

import br.com.souzacruz.sped.contabil.IEditableSequencialArquivoSped;
import br.com.souzacruz.sped.contabil.service.impl.model.compositeId.SequencialArquivoSpedPK;

/**
 * Classe de modelo de Sequencial Arquivo Sped.
 * @author Cortez
 */
@Entity
@Table(name = "SEQ_ARQ_SPED")
public class SequencialArquivoSped implements IEditableSequencialArquivoSped {

	/** CONSTANTE. */
	private static final int TAM_30 = 50;

	/** Variavel de serial. */
	private static final long serialVersionUID = 1L;

	/** Constante. */
	private static final int TAM_2000 = 2000;

	/** Chave primária da tabela. */
	private SequencialArquivoSpedPK id;

	/** Bloco (assunto a ser tratado). */
	private String bloco;

	/** Descrição do bloco. */
	private String descricao;

	/** Flag de utilização Matriz Sap. */
	private String flagUtilizacao;

	/** Flag de Geração do bloco. */
	private String flagGeracao;

	/** Flag de Geração Sazonal do Bloco. */
	private String flagGeracaoSazonal;

	/** Lista de arquivos sped. */
//	private List<IArquivoSped> arquivosSped;

	/** Pega os primeiros 50 caracteres da descrição. */
	private String resumoDescricao;

	@EmbeddedId
	public SequencialArquivoSpedPK getId() {
		return this.id;
	}

	@Column(name = "IND_BLOCO", length = 1)
	public String getBloco() {
		return bloco;
	}

	@Column(name = "DSC_LINHA", length = TAM_2000)
	public String getDescricao() {
		return descricao;
	}

	@Basic
	@Column(name = "FLG_UTLZCO", length = 1)
	public String getFlagUtilizacao() {
		return flagUtilizacao;
	}

	@Column(name = "FLG_GERCAO", length = 1)
	public String getFlagGeracao() {
		return flagGeracao;
	}

	@Column(name = "FLG_GERCAO_SAZON", length = 1)
	public String getFlagGeracaoSazonal() {
		return flagGeracaoSazonal;
	}

//	@OneToMany(mappedBy = "id.sequencialArquivoSped",
//			   targetEntity = br.com.souzacruz.sped.contabil.service.impl.model.ArquivoSped.class)
//	public List<IArquivoSped> getArquivosSped() {
//		return this.arquivosSped;
//	}

	/**
	 * getter de resumo Descricao que pega os primeiros 50 caracteres da descrição.
	 * @return string
	 */
	@Transient
	public final String getResumoDescricao() {
		if(this.descricao.length() > TAM_30) {
			this.resumoDescricao = this.descricao.substring(0, TAM_30);
		} else {
			this.resumoDescricao = this.descricao;
		}
		return resumoDescricao;
	}

	public void setId(final SequencialArquivoSpedPK seqArqSpedPK) {
		this.id = seqArqSpedPK;
	}

	public void setBloco(final String indBloco) {
		this.bloco = indBloco;
	}

	public void setDescricao(final String dscLinha) {
		this.descricao = dscLinha;
	}

	public void setFlagUtilizacao(final String flgUtlzco) {
		this.flagUtilizacao = flgUtlzco;
	}

	public void setFlagGeracao(final String flgGercao) {
		this.flagGeracao = flgGercao;
	}

	public void setFlagGeracaoSazonal(final String flgGercaoSazon) {
		this.flagGeracaoSazonal = flgGercaoSazon;
	}

//	public void setArquivosSped(final List<IArquivoSped> arqSpeds) {
//		this.arquivosSped = arqSpeds;
//	}

	public final void setResumoDescricao(final String resumoDescricao) {
		this.resumoDescricao = resumoDescricao;
	}
}
package br.com.souzacruz.sped.contabil.service.impl.model.compositeId;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;

import br.com.souzacruz.sped.contabil.IEmpresaMatriz;

/**
 * Composite Id de SequencialArquivoSped pk.
 *
 * @author Cortez
 */
@Embeddable
public class SequencialArquivoSpedPK implements Serializable {

	/** Variavel de serial. */
	private static final long serialVersionUID = 1L;

	/** Número Seqüencial do bloco. */
	private Integer numeroSequencialGrupoBloco;

	/** Lf Empresa Matriz. */
	private IEmpresaMatriz empresaMatriz;

	/** Indica o tipo de layout do arquivo 0-SPED-ECD/1-SPED-FCONT. */
	private String tipoLayout;

	/** Tipo de Registro. */
	private String tipoRegistro;

	@GeneratedValue(generator = "S_SEQ_ARQ_SPED_01", strategy = GenerationType.SEQUENCE)
	@SequenceGenerator(name = "S_SEQ_ARQ_SPED_01", sequenceName = "S_SEQ_ARQ_SPED_01", allocationSize = 1)
	@Column(name = "NUM_SEQ_GRUPO_BLOCO")
	public Integer getNumeroSequencialGrupoBloco() {
		return numeroSequencialGrupoBloco;
	}

	@ManyToOne(targetEntity = br.com.souzacruz.sped.contabil.service.impl.model.EmpresaMatriz.class)
	@JoinColumns({ @JoinColumn(name = "COD_HOLD", referencedColumnName = "COD_HOLDING"),
				   @JoinColumn(name = "COD_MATRIZ", referencedColumnName = "COD_MATRIZ") })
	public IEmpresaMatriz getEmpresaMatriz() {
		return empresaMatriz;
	}

	@Column(name = "TIP_LAYOUT")
	public String getTipoLayout() {
		return tipoLayout;
	}

	@Column(name = "TIP_REGTRO")
	public String getTipoRegistro() {
		return tipoRegistro;
	}

	public void setNumeroSequencialGrupoBloco(final Integer numSeqialGrupoBloco) {
		this.numeroSequencialGrupoBloco = numSeqialGrupoBloco;
	}

	public void setEmpresaMatriz(final IEmpresaMatriz lfEmpresaMatriz) {
		this.empresaMatriz = lfEmpresaMatriz;
	}

	public void setTipoLayout(final String tipLayout) {
		this.tipoLayout = tipLayout;
	}

	public void setTipoRegistro(final String tipRegtro) {
		this.tipoRegistro = tipRegtro;
	}
}
ralphsilver

Olha… eu olhando eu não vejo nenhum problema… exceto a relação que há na chave composta… se não me engano… vc não pode por relação nela… pega esse atributo e joga na entidade e testa…

G

Na verdade o padrão é 50 para qualquer framework. Isso está na spec do JPA.

Criado 8 de abril de 2010
Ultima resposta 8 de abr. de 2010
Respostas 6
Participantes 3