Como Salvar um array de String (String[]) no banco de dados com JPA RESOLVIDO

18 respostas
E

Pessoal é o seguinte , queria saber se vocês sabem como eu posso salvar esta classe no banco

class Usuario{
    private String[] emails;

}

18 Respostas

E

Obs(Suponha que eu não tenho a tabela emails)

C

Erickfm8,

Tem que ser um array de String[]? Não pode ser um Set ou List ?

public class Usuario {

    ...

    @OneToMany(cascade = { CascadeType.MERGE, CascadeType.REMOVE },
                         fetch = FetchType.EAGER, mappedBy = "usuario")
    private Set<String> emails;

    public String[] getArrayEmails() {
        String[] arrayEmails = null;
        if(this.emails != null && this.email.size() >0 ) {
            String[] arrayEmails = (String[])(this.emails.toArray(emails.size());
        }
        return arrayEmails;
    }

    ....

}

@braços

E

Sim temque ser um array de String[] , porem gostei dessa solução, mais não tem como salvar o array de String via Jap? Não existe alguma forma?

Obrigado por responder ccllss

E

So arrumando ali “Jap” é Jpa

B

Ola,

Seguinte, é quase uma regra:

Se uma instnacia de uma classe tem/pode ter referencia para 1 ou mais instancias de outra classe, esta relação é 1->0**N, então vc irá precisar de outra tabela.

Em JPA, até onde sei, não há como trabalhar com arrays… não poderias converter este tipo para um set ou list, como o colega comentou?

Ps.: quando vc digitar algo errado, na resposta, vc pode edita-la… assim fica mais légivel do que enviar outra resposta :wink:

abelgomes

vc esta usando o eclipse, pq na no netbeans quando vc gera as classes a partir do banco de dados, ele ja lhe dar com os relacionamentos, e não tem array é tudo List.

E

Então pessoal acho que não me expressei direito é o seguinte.

Primeiramente eu estou usando netbeans, é aquele exemplo usuario e emai era so para vocês enteder o quie eu estou querendo, ou seja eu queria saber se é possivil armazenar um array em uma tabela, ou existe alguma forma diferente de fazer isso entendeu? o caso é o seguinte
especificando o meu caso é o seguinte

tenho a classe

public class Cartao {

    private String NumerosCartao[];


    public Cartao() {
        this.gerarNumeros();
    }

    public String[] getNumerosCartao() {
        return NumerosCartao;
    }

    public void setNumerosCartao(String[] numerosCartao) {
        this.NumerosCartao = numerosCartao;
    }

    public String[] gerarNumeros() {}// este metodo gera numeros aleatorio e inseri no array

}

preciso armazena esta classe no banco, não vejo necessidade de criar outra tabela
"neste caso"

C

erickfm8,

Então brow… O que te impede de fazer isso ?

public class Cartao {   
 
    @OneToMany(cascade = { CascadeType.MERGE, CascadeType.REMOVE },   
                         fetch = FetchType.EAGER, mappedBy = "usuario")
    private Set<String> NumerosCartao;
  
  
    public Cartao() {   
        this.gerarNumeros();   
    }   
  
    public Set<String> getNumerosCartao() {   
        return NumerosCartao;   
    }   
  
    public void setNumerosCartao(Set<String> numerosCartao) {   
        this.NumerosCartao = numerosCartao;   
    }   
  
    public void gerarNumeros() {
        String[] arrayGerado = <CRIA SEU ARRAY CONFORME SUA NECESSIDADE>;
        Collections.addAll(this.NumerosCartao, arrayGerado);
    }  
}
E

Boa solução, mais fixando isto ainda , está e a unica maneira? finalizando não tem como usar arrays?

abelgomes

se vc fizer a geração das classes verá que nao tera array de e-mails sem ter uma tabela no banco…;s e se tiver a tabela no banco a classe gerada virá com List/Collection

oddy.silva

Usando Hibernate você pode usar a anotação Collection of Elements.
Daí você pode salvar, por exemplo, uma Lista de String.

@CollectionOfElements
List<String> getUsuarios(){
 return this.usuarios;
}

A Diferença é que dessa maneira, no Banco, será criada uma tabela representando uma Entidade Fraca chamada Usuarios; Além disso, você não
tem que se preocupar em ficar colocando @OneToMany e @ManyToOne em ninguém. Só crie a Lista, anote com @CollectionOfElements e seja feliz. :smiley:

Experimenta aí :smiley:

oddy.silva

Eu testei aqui, e você pode usar o CollectionOfElements direto com um array de String. Daí acho q atende sua necessidade:

private String[] x;

    @CollectionOfElements
    public String[] getX() {
        return x;
    }

    public void setX(String[] x) {
        this.x = x;
    }

O que você acha? :smiley:

E

Estou usando TopLink JPA , acho que a melhor solução vai ser a do nosso colega ccllss certo?

abelgomes

sim…nesse caso tem que ter a tabela que vc tanto nao quer

oddy.silva

Pra uma tabela só, com o Collection Of Elements, dá pra usar a anotação @JoinTable junto.

Segundo a documentacao do Hibernate Annotations:

private String[] x;  
   
@CollectionOfElements  
@JoinTable(
table=@Table(name="nomeDaTabela"))
  public String[] getX() {  
  return x;  
 }    
}

Mas, tipo, se você estiver usando só JPA, a solução do amigo acima talvez seja melhor pra você.
Acho que daqui deste POST que você abriu deu pra tirar bastante idéia. Só não esquece de colocar um [RESOLVIDO] depois.
Flw.

abelgomes

é isso ae…

E

@CollectionOfElements

este carinha armazena um Collections no banco sem criar uma tabela

oddy.silva

Na verdade, se não usar um @JoinTable junto do @CollectionOfElements, ele cria uma tabela (uma entidade fraca) sem chave primária, mas com uma chave estrangeira apontando para a Entidade Pai. Mesmo assim, usar @CollectionOfElements, com ou sem @JoinColumn, é uma das maneiras mais preguiçosas de se armazenar um array de Strings. Eu gosto, rsrsrsrs

Criado 22 de abril de 2010
Ultima resposta 23 de abr. de 2010
Respostas 18
Participantes 5