[RESOLVIDO] org.hibernate.PropertyAccessException

4 respostas
Y

Galera, ta dando esse erro aqui na minha aplicação, não faço ideia do que seja, começou quando eu acrescentei três campos que são de outra tabela no formulário…

Exception in thread "AWT-EventQueue-0" org.hibernate.PropertyAccessException: could not get a field value by reflection getter of br.inf.topsoft.Model.tab_parc.codparc at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:35) at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:183) at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3591) at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3307) at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181) at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:218) at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397) at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:87) at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1707) at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1678) at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1563) at org.hibernate.loader.Loader.doQuery(Loader.java:673) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) at org.hibernate.loader.Loader.doList(Loader.java:2220) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) at org.hibernate.loader.Loader.list(Loader.java:2099) at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569) at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283) at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:305) at br.inf.topsoft.Dao.CadParcDao.getUnicoFunc(CadParcDao.java:126) at br.inf.topsoft.Controller.CadParcCtrl.getUnicoFunc(CadParcCtrl.java:80) at br.inf.topsoft.View.FrmLanParc.<init>(FrmLanParc.java:66) at br.inf.topsoft.View.FrmCadParc.Alterar(FrmCadParc.java:41) at br.inf.topsoft.Forms.FrmCadPrin.excluiActionPerformed(FrmCadPrin.java:219) at br.inf.topsoft.Forms.FrmCadPrin.access$300(FrmCadPrin.java:14) at br.inf.topsoft.Forms.FrmCadPrin$4.actionPerformed(FrmCadPrin.java:124) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6504) at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) at java.awt.Component.processEvent(Component.java:6269) at java.awt.Container.processEvent(Container.java:2229) at java.awt.Component.dispatchEventImpl(Component.java:4860) at java.awt.Container.dispatchEventImpl(Container.java:2287) at java.awt.Component.dispatchEvent(Component.java:4686) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) at java.awt.Container.dispatchEventImpl(Container.java:2273) at java.awt.Window.dispatchEventImpl(Window.java:2713) at java.awt.Component.dispatchEvent(Component.java:4686) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707) at java.awt.EventQueue.access$000(EventQueue.java:101) at java.awt.EventQueue$3.run(EventQueue.java:666) at java.awt.EventQueue$3.run(EventQueue.java:664) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) at java.awt.EventQueue$4.run(EventQueue.java:680) at java.awt.EventQueue$4.run(EventQueue.java:678) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:677) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Integer field br.inf.topsoft.Model.tab_parc.codparc to java.lang.Integer at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55) at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36) at java.lang.reflect.Field.get(Field.java:372) at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:32) ... 62 more

Método Dao que eu chamo e o Netbeans afirma que está errado:

public tab_func getUnicoFunc(tab_parc asd) {
        tab_func obj2;
        Criteria filtro = session.createCriteria(tab_func.class);
        filtro.add(Restrictions.eq("codparc", asd.getCodparc()));
        obj2 = (tab_func) filtro.uniqueResult();
        return obj2;
    }

Esta é a Model do tab_parc

@Entity
@Table(name = "tab_parc")
public class tab_parc implements Serializable {

    @Id
    @GeneratedValue(generator = "seq_tabparc", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "seq_tabparc", sequenceName = "seq_tabparc")
    @Column(unique = true, name = "codparc", updatable = false)
    private Integer codparc;
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "nasparc")
    private Date nasparc; //Data de Nascimento
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "cadparc")
    private Date cadparc; //Data de Cadastro
    @Column(name = "nomparc")
    private String nomparc; //Nome do Parceiro
    @Column(name = "codfili")
    private String codfili; //Filial
    @Column(name = "cnpparc")
    private String cnpparc; //CPF / CNPJ
    @Column(name = "regparc")
    private String regparc; //Segundo Documento
    @Column(name = "obsparc")
    private String obsparc; //Observações
    @Column(name = "homparc")
    private String homparc; //Home Page
    @Column(name = "emaparc")
    private String emaparc; //e-mail
    @Column(name = "nacparc")
    private String nacparc; //character varying(25); //Nacionalidade
    @Column(name = "natparc")
    private String natparc; //character varying(25); //Naturalidade
    @Column(name = "ctpparc")
    private String ctpparc; //character(15); //Carteira Profissional
    @Column(name = "cnhparc")
    private String cnhparc; //character(11); //Numero da CNH
    @Column(name = "cat_cnh")
    private String cat_cnh; //character varying(2); //Categoria da CNH
    @Column(name = "estcivi")
    private String estcivi; //character(2) DEFAULT 'IN'::bpchar; //Estado Civil
    //@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @Column(name = "codocup")
    private Integer codocup; //Código da Ocupação
    @Column(name = "sexparc")
    private Character sexparc; //character(1); //Sexo
    @Column(name = "pesparc")
    private Character pesparc; //character(1); //Tipo de Pessoa
    @Column(name = "fgeparc")
    private Short fgeparc; //smallint; //Ativo?
//getters e setters
}

E este é o Model do tab_func:

@Entity
@Table(name = "ponto.tab_func")
public class tab_func implements Serializable {

    @Id
    @GeneratedValue(generator = "ponto.seq_tabfunc", strategy = GenerationType.AUTO)
    @SequenceGenerator(name = "ponto.seq_tabfunc", sequenceName = "ponto.seq_tabfunc")
    @Column(unique = true, name = "codfunc", updatable = false)
    private int codfunc;// integer NOT NULL
    
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity= br.inf.topsoft.Model.tab_parc.class)
    @JoinColumn(name="codparc", referencedColumnName="codparc", nullable=false)
    private tab_parc codparc;// integer NOT NULL
    
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity= br.inf.topsoft.Model.tab_sind.class)
    @JoinColumn(name="codsind", referencedColumnName="codsind", nullable=false)
    private tab_sind codsind;// integer NOT NULL
    
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity= br.inf.topsoft.Model.tab_ocup.class)
    @JoinColumn(name="codocup", referencedColumnName="codocup", nullable=false)
    private tab_ocup codocup;// integer NOT NULL
    
            // Estes três campos abaixo foram os que eu adicionei no formulário

    @Column(name = "sal_base")
    private Float sal_base;// numeric(12,2)
    @Column(name = "sal_tipo")
    private Integer sal_tipo;// smallint, -- 1 - Mensalista    2 - Horista    3 - Diarista    4 - Comissinista
    @Column(name = "carga_horaria")
    private Float carga_horaria;// numeric(10,4)
//getters e setters
}

Então, se alguém puder me ajudar, ficarei grato. To a dois dias tentando resolver esse erro e nada.

4 Respostas

M

E seus getters e setters? Onde eles estão? Aparentemente o erro está nele, dê uma revisada nisso, se não fizer como a especificação o Hibernate não encontra via reflection a variável.

Y

Eu usei o NetBeans para gerar os getters e setters automaticamente, e ficou assim:

Campo codparc, por exemplo:

/**
     * @return the codparc
     */
    public int getCodparc() {
        return codparc;
    }

    /**
     * @param codparc the codparc to set
     */
    public void setCodparc(Integer codparc) {
        this.codparc = codparc;
    }

Ele sempre funcionou perfeitamente desse jeito. Não sei porque agora ta dando esse problema.

M

Amigo, descobri o seu problema, li com mais atenção o erro e percebi que ele está tentando guardar uma variável dentro de uma classe, para ser mais específico, ele está tentando guardar um Integer dentro da sua classe tab_parc, ou seja, teremos que dentro da sua classe, acessar o encapsulamento e setar a declaração de Integer da classe, ou seja, sua variável.
Vamos tentar fazer dessa forma aqui:

public tab_func getUnicoFunc(tab_parc asd) { tab_func obj2; Criteria filtro = session.createCriteria(tab_func.class); filtro.add(Restrictions.eq("codparc.codparc", asd.getCodparc())); obj2 = (tab_func) filtro.uniqueResult(); return obj2; }

Uma dica de implementação, é colocar nomes por extenso em Java, mesmo que fique bem grande, que é a recomendação da Oracle. E outro detalhe, colocar ClasseModel parece de certa forma uma ‘perfumaria’, mas isso lhe ajuda na hora de buscar possíveis classes, além de deixar o nome por extenso, é mais fácil para qualquer outro programador que adentrar no projeto em desenvolvimento.

Um abraço!

Y

Obrigado matheusgeres! Era esse mesmo meu problema. Nunca teria imaginado nessa solução.

Quanto a dica que você me deu: Eu uso esse padrão que você falou mesmo, mas na empresa em que trabalho é necessário seguir o padrão deles, que é deixar os métodos e variáveis com o mesmo nome do campo na tabela.

Abraço.

Criado 8 de fevereiro de 2013
Ultima resposta 15 de fev. de 2013
Respostas 4
Participantes 2