Set field value by reflection

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:

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

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();
	}

}

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

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

[code] @Column(name = “ESTADO”)
@Type(type=“character”)
private String estado;

 @Column(name = "CEP")  
 @Type(type="character")  
 private String cep; 

[/code]
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[]

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:

[quote=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

[code] @Column(name = “ESTADO”)
@Type(type=“character”)
private String estado;

 @Column(name = "CEP")  
 @Type(type="character")  
 private String cep; 

[/code]
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[][/quote]

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

[quote=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. :|[/quote]

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

[quote=edmafer][quote=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

[code] @Column(name = “ESTADO”)
@Type(type=“character”)
private String estado;

 @Column(name = "CEP")  
 @Type(type="character")  
 private String cep; 

[/code]
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[][/quote]

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

[quote]
Wrong column type: CEP, expected: varchar(255)
[/quote][/quote]

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

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.

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

[quote=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[/quote]

Própria do hibernate:

org.hibernate.annotations.Type

[quote=edmafer][quote=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[/quote]

Própria do hibernate:

org.hibernate.annotations.Type [/quote]

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

coloque assim

[code] @Column(name = “ESTADO”)
@Type(type=“string”)
private String estado;

@Column(name = “CEP”)
@Type(type=“string”)
private String cep; [/code]

[quote=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[/quote]

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.

[quote=Lavieri]coloque assim

[code] @Column(name = “ESTADO”)
@Type(type=“string”)
private String estado;

@Column(name = “CEP”)
@Type(type=“string”)
private String cep; [/code][/quote]

Dá o erro do Wrong column… :frowning:

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…

[quote=edmafer][quote=Lavieri]coloque assim

[code] @Column(name = “ESTADO”)
@Type(type=“string”)
private String estado;

@Column(name = “CEP”)
@Type(type=“string”)
private String cep; [/code][/quote]

Dá o erro do Wrong column… :([/quote]

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

tenta assim

[code][code] @Column(name = “ESTADO”)
@Type(type=“char(2)”)
private String estado;

@Column(name = “CEP”)
@Type(type=“char(9)”)
private String cep; [/code]

vi o pessoal mapeando com XML

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

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: