Set field value by reflection

31 respostas
E

Vamos lá pessoal, dei uma procurada aqui e no Google e nada que me ajudasse.

A minha estrutura é a seguinte: Hibernate, Java e Firebird

A conexão de banco eu utilizei generics para usar a mesma para todas as classes… não uso persistence.xml e adiciono tudo em tempo de execução. Com execeção desta classe que tem campos dos tipo char no banco, as outras funcionam perfeitamente.

Então…

Tenho a seguinte entidade:

public class Endereco implements Serializable {
 ...

 @Column(name = "ESTADO")
 @Type(type="character")
  private String estado;
 
 ...

 public String getEstado() {
   return estado;
 }

 public void setEstado(String estado) {
    this.estado = estado;
 }
}

Quando vou carregar os dados ele me retorna o seguinte erro:

E acredito que deva estar faltando alguma anotação… mas andei pesquisando e nada :frowning:

31 Respostas

L

ele esta porocurando um propriedade q não existe no seu codigo, e por isso não consegue atulizar seu valor por reflexao, provavelemnte vc esta utilizando um membro que não é @Embedable e não ta colocando nenhum mapeamento especial pra ele, o hiberante acaba q n encontra o lugar correto de mapear… mostra a tua classe completa, q fica + facil de ajudar

E

Ok, ai está.

Não consegui encontrar esta propriedade que ele está procurando… onde será que estou errando?

Há sim, gerei as entidades pelo netbeans :smiley:

/**
 *
 * @author Edson Marco Ferrari Junior
 */
@Entity
@Table(name = "ENDERECO")
@SequenceGenerator(name="GENIDENDERECO",sequenceName="GENIDENDERECO")
public class Endereco implements Serializable, AccessingDatabase {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "IDENDERECO")
    @GeneratedValue(strategy = GenerationType.AUTO, generator="GENIDENDERECO")
    private Integer idendereco;
    
    @Column(name = "LOGRADOURO")
    private String logradouro;
    
    @Column(name = "NUMERO")
    private String numero;
    
    @Column(name = "COMPLEMENTO")
    private String complemento;
    
    @Column(name = "BAIRRO")
    private String bairro;
    
    @Column(name = "CIDADE")
    private String cidade;
    
    @Column(name = "ESTADO")
    @Type(type="character")
    private String estado;
    
    @Column(name = "CEP")
    @Type(type="character")
    private String cep;
    
    @Column(name = "CAIXAPOSTAL")
    private String caixapostal;
    
    @Column(name = "IDORIGINAL")
    private Integer idoriginal;
    
    @Column(name = "TABLENAME")
    private String tablename;
    
    public Endereco() {
    }

    public Endereco(Integer idendereco) {
        this.idendereco = idendereco;
    }

    public Integer getIdendereco() {
        return idendereco;
    }

    public void setIdendereco(Integer idendereco) {
        this.idendereco = idendereco;
    }

    public String getLogradouro() {
        return logradouro;
    }

    public void setLogradouro(String logradouro) {
        this.logradouro = logradouro;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }

    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public String getCep() {
        return cep;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    public String getCaixapostal() {
        return caixapostal;
    }

    public void setCaixapostal(String caixapostal) {
        this.caixapostal = caixapostal;
    }

    public Integer getIdoriginal() {
        return idoriginal;
    }

    public void setIdoriginal(Integer idoriginal) {
        this.idoriginal = idoriginal;
    }

    public String getTablename() {
        return tablename;
    }

    public void setTablename(String tablename) {
        this.tablename = tablename;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idendereco != null ? idendereco.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Endereco)) {
            return false;
        }
        Endereco other = (Endereco) object;
        if ((this.idendereco == null && other.idendereco != null) || (this.idendereco != null && !this.idendereco.equals(other.idendereco))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.theos.client.database.entities.Endereco[idendereco=" + idendereco + "]";
    }

	@Override
	public Integer getId() {
		return getIdendereco();
	}

}
T

http://blogs.warwick.ac.uk/colinyates/entry/i_hate_hibernate/

L

pelo post do thingol e pelo seu post com seu código, é certo que esse @Type ai q ta dando o galho todo...

provavelmente o hibernate esta tentando enfiar um tipo char[] no seu tipo String ... e isso ta dando um erro...

não lembro exatamente se

@Column(name = "ESTADO")  
     @Type(type="character")  
     private String estado;  
       
     @Column(name = "CEP")  
     @Type(type="character")  
     private String cep;
força esses 2 para que eles sejam vistos como array de char.... enfim... deve ser isso... ou vc remove esse @Type... ou vc muda o tipo de String para char[]
E

Eu havia visto esta página… mas não tenho campos cep nulos (Pelo menos não nos registros a serem carregados) e os campos que tenho nulos não entendi o problema deles…

Nas outras entidades eu tenho campos nulos, mas não tenho este problema. :expressionless:

E
Lavieri:
pelo post do thingol e pelo seu post com seu código, é certo que esse @Type ai q ta dando o galho todo...

provavelmente o hibernate esta tentando enfiar um tipo char[] no seu tipo String ... e isso ta dando um erro...

não lembro exatamente se

@Column(name = "ESTADO")  
     @Type(type="character")  
     private String estado;  
       
     @Column(name = "CEP")  
     @Type(type="character")  
     private String cep;
força esses 2 para que eles sejam vistos como array de char.... enfim... deve ser isso... ou vc remove esse @Type... ou vc muda o tipo de String para char[]

Pois é... mas acontece que o campo no banco é do tipo char... e se eu não colocar o type ele dá o sequinte erro:


Wrong column type: CEP, expected: varchar(255)

L

edmafer:
Eu havia visto esta página… mas não tenho campos cep nulos (Pelo menos não nos registros a serem carregados) e os campos que tenho nulos não entendi o problema deles…

Nas outras entidades eu tenho campos nulos, mas não tenho este problema. :|

o que vc pode tirar como lição desse post q o thingol colocou, é que quando os tipos são incopativeis da esse problema… por exemplo…

um boolean não aceita “null” … pq boolean é primitvo e null so entra em um Object…

o mesmo pode estar acontecendo com vc… seu camo é um String, e o hibernate ta tentando enfiar um array de chars nele… ta dando o mesmo problemas… tipos incompativeis

L
edmafer:
Lavieri:
pelo post do thingol e pelo seu post com seu código, é certo que esse @Type ai q ta dando o galho todo...

provavelmente o hibernate esta tentando enfiar um tipo char[] no seu tipo String ... e isso ta dando um erro...

não lembro exatamente se

@Column(name = "ESTADO")  
     @Type(type="character")  
     private String estado;  
       
     @Column(name = "CEP")  
     @Type(type="character")  
     private String cep;
força esses 2 para que eles sejam vistos como array de char.... enfim... deve ser isso... ou vc remove esse @Type... ou vc muda o tipo de String para char[]

Pois é... mas acontece que o campo no banco é do tipo char... e se eu não colocar o type ele dá o sequinte erro:


Wrong column type: CEP, expected: varchar(255)

mais ai é a vida... o fato é q vc não pode enfiar uma array de char[] em uma String =P ... a não ser, q vc faça um atribute override do valor q é um char[] q ta dentro da String... mas seria algo q n fiz, tem q olhar pra ver como fazer... e pode te dar problemas, pq naum é bom setar Strings por reflexao, basta uma ir pro poll de strings e uma mexida na array de char pra avacalhar todo seu programa

E

Lição aprendida, e tenho certeza que será muito útil.

Mas infelizmente não resolveu este problema…

alterei para char[]

@Column(name = "CEP")
private char[] cep;

E também nos getters and setters…

Mas ai ele retornou:

Teimei e coloquei o @Type de volta…

E voltamos a mensagem de erro anterior:

Há sim… para garantir ranquei todos o ceps nulos e transformei-os em vazios.

L

essa anotação @Type é do proprio hibernate ne ?? não é do JPA ??

é meio estrenho… isso… quando usei firbird mapiei sem problemas meus campos varchar o.O

tenta tirar esse @Type, e poem um @Basic no lugar

Edit.: e sim é bom lembrar… como realmente é mapeado esse campo no seu DB ?? ele é de q tipo ?

outra coisa é q char[] aceita nulo, pois array de char é um objeto

E

Lavieri:
essa anotação @Type é do proprio hibernate ne ?? não é do JPA ??

é meio estrenho… isso… quando usei firbird mapiei sem problemas meus campos varchar o.O

tenta tirar esse @Type, e poem um @Basic no lugar

Própria do hibernate:

org.hibernate.annotations.Type
L

edmafer:
Lavieri:
essa anotação @Type é do proprio hibernate ne ?? não é do JPA ??

é meio estrenho… isso… quando usei firbird mapiei sem problemas meus campos varchar o.O

tenta tirar esse @Type, e poem um @Basic no lugar

Própria do hibernate:

org.hibernate.annotations.Type

bom acho q descobri seu problema

http://www.java2s.com/Code/Java/Hibernate/JavaTypeVSHibernateType.htm

vc esta tentando colocar um tipo “char” em um tipo “char[]” por isso ta dando o erro

L

coloque assim

@Column(name = "ESTADO")    
 @Type(type="string")    
 private String estado;    
     
 @Column(name = "CEP")    
 @Type(type="string")    
 private String cep;
E

Lavieri:
essa anotação @Type é do proprio hibernate ne ?? não é do JPA ??

é meio estrenho… isso… quando usei firbird mapiei sem problemas meus campos varchar o.O

tenta tirar esse @Type, e poem um @Basic no lugar

Edit.: e sim é bom lembrar… como realmente é mapeado esse campo no seu DB ?? ele é de q tipo ?

outra coisa é q char[] aceita nulo, pois array de char é um objeto

Então… no @Basic consigo setar o tipo? Aqui tentar usar ele sem nenhum outro parametro e ele me retornou o erro de Wrong Column :frowning:

Você por acaso tem ainda a entidade que tu utilizou no firebird com char? Para compararmos?

O campo é do tipo:

CEP          CEP /* CEP = CHAR(9) */,

O cep da frente é um domínio:

CREATE DOMAIN CEP AS 
CHAR(9) CHARACTER SET ISO8859_1 
COLLATE PT_BR

puxa… dificil hein. Com certeza estou esquecendo alguma coisinha.

E
Lavieri:
coloque assim
@Column(name = "ESTADO")    
 @Type(type="string")    
 private String estado;    
     
 @Column(name = "CEP")    
 @Type(type="string")    
 private String cep;

Dá o erro do Wrong column... :(

L

xii tenho n… n aki…

c tiver ta no notebook do meu cunhado… e ele mora no interiro da paraíba… heheh O.o complicado…

mas o fato é

@Type(type=“character”) requer um campo do tipo “char” … e por isso ta dando pau… mas pelo q vc esta dizendo q vc tem é um tipo parecido com “varchar” … n lembro bem do firebid n foi feito por mim o banco, era um banco antigo de outra pessoa … eu so fiz mapear e colocar pra roda em java… nem lembro exatamente c o campo era CHAR(9) ou VARCHAR … enfim…

L
edmafer:
Lavieri:
coloque assim
@Column(name = "ESTADO")    
 @Type(type="string")    
 private String estado;    
     
 @Column(name = "CEP")    
 @Type(type="string")    
 private String cep;

Dá o erro do Wrong column... :(

axei alguem com o mesmo problema do seu

https://forum.hibernate.org/viewtopic.php?f=25&t=952146

tem q axar uma solução pro mapeamento correto

http://www.java2s.com/Code/Java/Hibernate/JavaTypeVSHibernateType.htm

L

tenta assim

[code] @Column(name = "ESTADO")    
 @Type(type="char(2)")    
 private String estado;    
     
 @Column(name = "CEP")    
 @Type(type="char(9)")    
 private String cep;

vi o pessoal mapeando com XML

http://www.javafree.org/viewtopic.jbb?t=3518&highlight=hibernate

E

Pois então… ainda não obtive sucesso :frowning:

tentei usar o tipo “char(9)” o Hibernate não aceita.

Então olhando nos seus links achei uma tabela de tipos aqui: http://www.roseindia.net/hibernate/hibernate-types.shtml
Mas não fui feliz com nenhum deles…

Tentei CharacterType, CharacterArrayType, CharArrayType, AnyType e etc e nada…

@Column(name = "ESTADO")
    @Type(type="org.hibernate.type.CharArrayType")
    private char[] estado;
    
    @Column(name = "CEP")
    @Type(type="org.hibernate.type.CharArrayType")    
    private char[] cep;

Mas ai nestes sempre retorna:

O duro que mudar no banco não é uma opção… juro que já pensei nisto :expressionless:

L

é complicado, tem q procurar por pessoas que resolveram esse problema… pra isso o melhor é procurar por Firebird, Hibernate e Field Char … deve ter alguma coisa por ai… tem esse exmplo ai com xml… mas enfim… não sei como vc vai solucionar seu problema, mas a verdade é que o Hibernate olha para o tipo “char” e ignora o que esta entre parenteses… para ele “char(9)” é um tipo char tb… e ele não enxerga como varchar…

T_T… não sei como resolver seu problema… vc vai ter q procurar uma forma do hibernate mapear direito esse seu campo

E

então… estou na pesquisa desde ontem.

Postei no fórum do hibernate.org e em uma lista java que participo.

Mas eu agradeço mesmo a ajuda que tu me deu.

Vamos continuar a pesquisa e tentar resolver isto o quanto antes… o patrão já está no meu pé :S

Assim que eu encontrar alguma coisa corro aqui e deixo a solução para outros que possam ter este problema.

L

quem manda usar firebird =x

hihihihi …

E

Lavieri:
quem manda usar firebird =x

hihihihi …

HAHAHAHA!!!

Tu acha que o problema pode ser por ser o firebird? E para ajudar ainda é uma versão antiga 1.5.3 :frowning:

L

edmafer:
Lavieri:
quem manda usar firebird =x

hihihihi …

HAHAHAHA!!!

Tu acha que o problema pode ser por ser o firebird? E para ajudar ainda é uma versão antiga 1.5.3 :(

não estou falando q pode ser… estou dizendo q é… heheh… metade dele, e outra metade do hibernate… por não enxergar o campo direito…

agora me surgio uma duvida… qual o Dialect q vc esta usando ?? na sua configuração ?? pq o problema é justamente pq o Dialect q o hibernate ta usando não sabe identificar um camo char(X) como um vamo VARCHAR(X) … enfim… posta ai tua conf do hibernate… mais especificamente o Dialect q vc ta usando… c tiver usando HQLDialect ou algo assim esse pode ser o problema… o Firebird tem um Dialect dele… e vc tem q usar este

E

Eu ia ficar super feliz se estivesse errado… mas eu estou usando o dialect do firebird :frowning:

private void loadBuild(String database) {
		setProperty("hibernate.dialect", "org.hibernate.dialect.FirebirdDialect");
		setProperty("hibernate.connection.driver_class", "org.firebirdsql.jdbc.FBDriver");
		setProperty("hibernate.connection.url", "jdbc:firebirdsql:hefesto/3051:"+database);
		setProperty("hibernate.connection.username", "sysdba");
		setProperty("hibernate.connection.password", "masterkey");
		setProperty("hibernate.show_sql", "false");
		setProperty("hibernate.hbm2ddl.auto", "validate"); 
	}
L

edmafer:

Mas eu agradeço mesmo a ajuda que tu me deu.

Vamos continuar a pesquisa e tentar resolver isto o quanto antes… o patrão já está no meu pé :S

ahh e avisa pro seu patrão q eu to procurando emprego ahuahuhua… diz pra ele me mandar o curriculo dele, q ai eu analiso pra ver c quero trabalhar ai =x uhahuauha…

mas é serio q to procurando =x

L

edmafer:
Eu ia ficar super feliz se estivesse errado… mas eu estou usando o dialect do firebird :frowning:

private void loadBuild(String database) { setProperty("hibernate.dialect", "org.hibernate.dialect.FirebirdDialect"); setProperty("hibernate.connection.driver_class", "org.firebirdsql.jdbc.FBDriver"); setProperty("hibernate.connection.url", "jdbc:firebirdsql:hefesto/3051:"+database); setProperty("hibernate.connection.username", "sysdba"); setProperty("hibernate.connection.password", "masterkey"); setProperty("hibernate.show_sql", "false"); setProperty("hibernate.hbm2ddl.auto", "validate"); }

haha hibernate é codigo aberto =x… olha o FirebirdDialect… e modifica pra aceitar “char” … e por favor, não me pergunte como fazer isso =x

Ps.: essa senha do Firebird tem uma segurança q sempre me impressiona sysdba -> masterkey

EDIT.: apenas como teste… Try Remove this shit ==>> setProperty(“hibernate.hbm2ddl.auto”, “validate”);
e então bota o tipo do campo pra String… e ve c funfa =x

E

HAHAHAHA!!!

Tá certo que eu gosto de alterar algumas coisas… mas não. Deixa do jeito que está :smiley:

A senha não é esta não… ta ai só preencher o espaço e não publicar a correta :slight_smile:

L

edmafer:
HAHAHAHA!!!

Tá certo que eu gosto de alterar algumas coisas… mas não. Deixa do jeito que está :smiley:

A senha não é esta não… ta ai só preencher o espaço e não publicar a correta :)

mas é isso q to falando… não importa q senha vc coloca… a senha mesmo é no servidor e não no banco de dados… portanto é so copiar o banco pra outra makina, com Firebird padrão q o banco abre com a senha basica… ou mesmo qualquer programa de Embeded abre tb o banco, com a senha padrão… é triste…

mas outra coisa é… existe 2 JDBC… tenta com o outro…

org.firebirdsql.jdbc.FirebirdDriver e org.firebirdsql.jdbc.FBDriver

tenta usar o 1°

ahh e não eskece do que editei la em cima

EDIT.: apenas como teste… Try Remove this shit ==>> setProperty(“hibernate.hbm2ddl.auto”, “validate”);
e então bota o tipo do campo pra String… e ve c funfa =x
tenta isso tb

E

[size=18]RESOLVIDO[/size]

O type não servia para nada (além de dar problema :D) o que faltava éra informar o tipo do campo na propriedate @Column.

@Column(name = "ESTADO", columnDefinition="char(2)")

Lavieri muito obrigado! Vamos dar continuidade ao projeto!

Eu estava preocupado achando que podia ser a minha forma de configuração do hibernate e mapeamento das classes sem xml (Eca!) :XD: . Mas fico muito feliz que tenha funcionado!

Quanto a senha, tu tem razão, mas utilizamos as permissões para mesmo alterando o servidor o usuário sysdba não tem permissão para acessar nada :slight_smile:

E referente ao emprego se eu souber de alguma vaga… :expressionless: Mas estamos longe pra caramba! Estou no interior do Paraná! Maringá. Se vier para estes lados vamos tomar aquela gelada!

L

edmafer:
[size=18]RESOLVIDO[/size]

O type não servia para nada (além de dar problema :D) o que faltava éra informar o tipo do campo na propriedate @Column.

@Column(name = "ESTADO", columnDefinition="char(2)")

Lavieri muito obrigado! Vamos dar continuidade ao projeto!

Quanto a senha, tu tem razão, mas utilizamos as permissões para mesmo alterando o servidor o usuário sysdba não tem permissão para acessar nada :slight_smile:

E referente ao emprego se eu souber de alguma vaga… :expressionless: Mas estamos longe pra caramba! Estou no interior do Paraná! Maringá. Se vier para estes lados vamos tomar aquela gelada!

Unica coisa gelada q vc pode tomar é LEITE! … to vendo sua foto ai em cima do computador, estou ate impressionado que vc ja saiba digitar e fazer alguns código hehehe… mas eu bebo a cerveja enquanto vc fica no seu leite… foda é ter q comprar uma cadeirinha pra gente poder siar junto ahuuaa

sempre é melhor resolver os problemas com JPA em vez de anotações do proprio hibernate, assim funciona pra qualquer linguagem … heheh é rapaz… mil arrodeios e o problema resolvia com columnDefinition, eu quase nunca uso essa anotação, isso é pra quem usa DBs reliquias! como firebird auahuahu

Inte, um abraço

Criado 18 de maio de 2009
Ultima resposta 19 de mai. de 2009
Respostas 31
Participantes 3