Ajuda JPA (toplink)

6 respostas
fabioebner

Pessoal estou recebendo oseguinte erro:

[TopLink Warning]: 2008.08.04 09:49:11.408--ClientSession(8345839)--Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException Internal Exception: org.postgresql.util.PSQLException: ERROR: relation "tb_operacao_movimentacao_pendencia_cd_operacao_movimentacao_pen" does not exist Error Code: 0 Call: select currval('tb_operacao_movimentacao_pendencia_cd_operacao_movimentacao_pendencia_seq') Query: ValueReadQuery() javax.persistence.RollbackException: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException Internal Exception: org.postgresql.util.PSQLException: ERROR: relation "tb_operacao_movimentacao_pendencia_cd_operacao_movimentacao_pen" does not exist Error Code: 0 Call: select currval('tb_operacao_movimentacao_pendencia_cd_operacao_movimentacao_pendencia_seq') Query: ValueReadQuery() at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit(EntityTransactionImpl.java:120) at oracle.toplink.essentials.internal.ejb.cmp3.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:60) at br.com.dnasolution.dao.FuncoesBanco.persist(FuncoesBanco.java:32) at br.com.dnasolution.util.Movimentacao.addPendencia(Movimentacao.java:53) at br.com.dnasolution.gui.MovimentacaoCaixa.addPend(MovimentacaoCaixa.java:455) at br.com.dnasolution.gui.MovimentacaoCaixa.access$600(MovimentacaoCaixa.java:30) at br.com.dnasolution.gui.MovimentacaoCaixa$7.actionPerformed(MovimentacaoCaixa.java:385) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)

pelo q eu entendi ele nao esta achando a minha sequencia “tb_operacao_movimentacao_pendencia_cd_operacao_movimentacao_pendencia_seq” porem ela existe… eu ate fiz o proprio toplink criar… atraves da classe q esta assim:

@Entity @Table(name = "tb_operacao_movimentacao_pendencia") @NamedQueries({@NamedQuery(name = "TbOperacaoMovimentacaoPendencia.findByCdOperacaoMovimentacaoPendencia", query = "SELECT t FROM TbOperacaoMovimentacaoPendencia t WHERE t.cdOperacaoMovimentacaoPendencia = :cdOperacaoMovimentacaoPendencia"), @NamedQuery(name = "TbOperacaoMovimentacaoPendencia.findByDsOperacaoPendencia", query = "SELECT t FROM TbOperacaoMovimentacaoPendencia t WHERE t.dsOperacaoPendencia = :dsOperacaoPendencia"), @NamedQuery(name = "TbOperacaoMovimentacaoPendencia.findByDtOperacaoPendencia", query = "SELECT t FROM TbOperacaoMovimentacaoPendencia t WHERE t.dtOperacaoPendencia = :dtOperacaoPendencia"), @NamedQuery(name = "TbOperacaoMovimentacaoPendencia.findByNmUsuarioOperacaoPendencia", query = "SELECT t FROM TbOperacaoMovimentacaoPendencia t WHERE t.nmUsuarioOperacaoPendencia = :nmUsuarioOperacaoPendencia"), @NamedQuery(name = "TbOperacaoMovimentacaoPendencia.findByNrIdentificacaoOperacaoPendencia", query = "SELECT t FROM TbOperacaoMovimentacaoPendencia t WHERE t.nrIdentificacaoOperacaoPendencia = :nrIdentificacaoOperacaoPendencia"), @NamedQuery(name = "TbOperacaoMovimentacaoPendencia.findByCdCpfUsuarioOperacaoPendencia", query = "SELECT t FROM TbOperacaoMovimentacaoPendencia t WHERE t.cdCpfUsuarioOperacaoPendencia = :cdCpfUsuarioOperacaoPendencia"), @NamedQuery(name = "TbOperacaoMovimentacaoPendencia.findByVlOperacaoPendencia", query = "SELECT t FROM TbOperacaoMovimentacaoPendencia t WHERE t.vlOperacaoPendencia = :vlOperacaoPendencia")}) public class TbOperacaoMovimentacaoPendencia implements Serializable { @Transient private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tb_operacao_movimentacao_pendencia_cd_operacao_movimentacao_pendencia_seq") @Column(name = "cd_operacao_movimentacao_pendencia", nullable = false) private Integer cdOperacaoMovimentacaoPendencia; @Column(name = "ds_operacao_pendencia", nullable = false) private String dsOperacaoPendencia; @Column(name = "dt_operacao_pendencia") @Temporal(TemporalType.DATE) private Date dtOperacaoPendencia; ......

pode ser pelo tamanho da sequence?? porem eu ja tentei mudar o nome e nao da certo. alguem sabe me falar pq?/

abracos

6 Respostas

rrigoni

Fabio,
Quando se usa @GeneratedValue com strategy Sequence, deve-se expecificar um gerador de sequencias desta forma

@Entity
@SequenceGenerator(sequenceName="sequence_name",allocationSize=1,initialValue=0, name = "sequence_name")
public class MyClass{

}



ou desta forma

@Entity
public class Inventory implements Serializable {

        @Id
        @GeneratedValue(generator="InvTab")
        @TableGenerator(name="InvTab", table="ID_GEN",
            pkColumnName="ID_NAME", valueColumnName="ID_VAL",
            pkColumnValue="INV_GEN")
        private long id;

Ronaldo

fabioebner
Ronaldo entao eu tenho q add o
@SequenceGenerator(sequenceName="sequence_name",allocationSize=1,initialValue=0, name = "sequence_name")

antes do meu "Public class "e mesmo assim manter o da minha coluna:
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tb_operacao_movimentacao_pendencia_cd_operacao_movimentacao_pendencia_seq") [code]

e isso??

abracos

rrigoni

Opa
sim apenas antes da assinatura da classe declare o gerador

// name = nome_do_objeto_gerador @SequenceGenerator(sequenceName="sequence_name",allocationSize=1,initialValue=0, name = "sequence_name") \

lembrando que o nome do generator declarado tem de ser o mesmo na propriedade generator da Annotation de sua sequencia.

Eu particularmente nao uso sequencias, uso sempre GenetarionType.IDENTITY
ai a responsabilidade disso fica a cargo do bando de dados. Mas isto varia de implementacao para implementacao.

Ronaldo

fabioebner

rrigoni
sou novato… qual a diferenca entre SEQUENCE, IDENTITY, AUTO e TABLE?

valeu

rrigoni

Opa,
Sequence é criado uma sequência com o nome que vc definiu, onde a cada insert ele consulta esta sequencia e insere o valor corrente dela apos isso incrementa e atualiza o valor da sequencia em banco.
IDENTITY singnifica que a estratégia de geraćao sera a cargo do banco, isso depende de banco, alguns criam uma sequencia e a controlam automaticamente como o postgres.
Já o Mysql temos o campo auto_increment.
Auto você atribue ao provedor de persistência a responsabilidade particular de gerar os ids.
Ja TABLE sera criada uma tabela onde sera armazenada as sequencias, com isso temos mais controle a respeito da geracao dos IDS.
Particularmente prefiro sempre usar IDENTITY e jogar esta responsabilidade ao banco de dados.

Ronaldo.

fabioebner

Entendi… valeu

cara eu coloquei o q vc falou e nao deu certo :frowning:

eu coloquei assmi:

@Entity @Table(name = "tb_operacao_movimentacao_consolidado") @SequenceGenerator(sequenceName="tb_operacao_movimentacao_consolidado_cd_operacao_movimentacao_consolidado_seq",allocationSize=1,initialValue=1, name = "tb_operacao_movimentacao_consolidado_cd_operacao_movimentacao_consolidado_seq") public class TbOperacaoMovimentacaoConsolidado implements Serializable { @Transient private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); private static final long serialVersionUID = 1L; @Id @GeneratedValue(generator = "tb_operacao_movimentacao_consolidado_cd_operacao_movimentacao_consolidado_seq") @Column(name = "cd_operacao_movimentacao_consolidado", nullable = false) private Integer cdOperacaoMovimentacaoConsolidado; @Column(name = "ds_operacao_consolidado", nullable = false)

tu ja mexeu com postgresql?? tu sabe se tem algum problema com o tamanho do nome da sequence??

pq tipo o nome da tabela e tb_operacao_movimentacao_consolidado e o campo e cd_operacao_movimentacao_consolidado logo o banco cria a seguinte sequence: tb_operacao_movimentacao_consolidado_cd_operacao_movimentacao_consolidado_seq e pelo q eu vi acho q nao da para criar uma sequence com esse tamanho pois no banco ele fica cortado como tb_operacao_movimentacao_cons_cd_operacao_movimentacao_cons_seq mas o engracado e q so da erro nessa tabela…

e otura coisa eu tenho q colocar o IDENTITY na minha @GeneratedValue tbm ou so como eu deixei ja esta bom??

abracos

Criado 4 de agosto de 2008
Ultima resposta 6 de ago. de 2008
Respostas 6
Participantes 2