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

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

class Usuario{
    private String[] emails;

}

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

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

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

So arrumando ali “Jap” é Jpa

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:

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.

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"

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

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

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

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:

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:

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

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

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.

é isso ae…

@CollectionOfElements

este carinha armazena um Collections no banco sem criar uma tabela

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