Salvar array de String[] no BD com Hibernate!

Olá amigos, acabei de fechar um tópico relacionado a minha JTable onde pegava os dados.
É o seguinte, eu peguei em minha table um campo onde armazenei em um array de Strings.
No meu caso o campo Itens Retirados eu guardei em um Strin[] itensRetirados.
Até ae tudo beleza… setei meu list e tudo legal.
Mas como eu faço para salvar no BD um array de Strings com o Hibernate.
Ele está dando erro no mapeamento dizendo que é impossível fazer o cast de String para String[].

Os amigos tem alguma idéia de como eu posso fazer, estive olhando aqui no fórum e alguns amigos não aconselham gravar arrays de String no BD… qual seria a outra alternativa?

Modelo.hbm.xml

[code]<?xml version="1.0"?>

church_saidapatrimonio_id_seq [/code]

Método que enche a list retornando um Object (está em meu modelo dá Table)

 public Object[][] getAllItems(){
       int row = getRowCount();
       int col = getColumnCount();
       Object[][] dados =new Object[row][1];
       
       for(int i=0;i<row;i++){
        dados[i][0] = getValueAt2(i, 0);
        //dados[i][1] = getValueAt2(i, 1);
        //dados[i][2] = getValueAt2(i, 2);
       
        
       }
       return dados;
   }[/code]

Tela onde encho o array:
[code]public List<SaidaPatrimonio> getAllItems(){
    Object[][] dados = model.getAllItems();
    List<SaidaPatrimonio>list = new ArrayList();
    SaidaPatrimonio s = new SaidaPatrimonio();
    int tam = dados.length;
    s.setNomePessoaPegou(txtNomePessoaPegou.getText());
    String data = new SimpleDateFormat("dd/MM/yyyy").format(txtDataRetirada.getDate());
    s.setDataRetirada(data);
    String [] descricoes = new String [tam];
    for(int i=0;i<tam;i++){//ver aqui que está dando o erro... usar o debug para ver os valores corretos
        
        descricoes[i] = String.valueOf(dados[i][0]);
        
       
    }
        s.setItensRetirados(descricoes);
       
        list.add(0, s);
    
    return list;
    
}

Um forte abraço a todos!

Opa, bom dia Andre.

Então cara, essa sua coluna itensretirados está como no banco ?? varchar ??

Tipo, para mapear um array, você deveria utilizar a tag dentro do seu hbm.xml. Mas se não me engano, isso representa um relacionamento one-to-many ou many-to-one. Não sei se é o seu caso.

Se voce tem um array te itens retirados e deseja salvar em uma única coluna, acho que você deve pensar em utilizar uma string com um delimitador

Ex. Item1;Item2;Item3 - Tudo isso é uma unica String.

Depois você poderia transforma-la em array novamente, separando pelo delimitador “;”.

Não sei se é isso. Mas em todos os casos, se você quiser tentar utilizar a tag dá uma olhada http://helpdesk.objects.com.au/java/how-to-map-an-array-using-hibernate

[]'s

Nunca precisei fazer, mas uma rapida procurada no google eu achei http://www.java2s.com/Code/Java/Hibernate/CollectionMappingArray.htm

Porém, ao invés de gravar tudo como array de String em um campo da tabela, porque não usar o método tradicional, que é criar uma segunda tabela e fazer um relacionamento ManyToOne. Usando hibernate isso vai ficar bastante simples de fazer

cara,

não faz desse jeito, crie uma tabela para esse seu caso, vai ficar dentro da forma normal de BD e alem disso, se vc precisar realizar alguma consulta para em cima desse dados do jeito que vc ta querendo nao vai ter jeito.

t+

Olá amigos.
Eu estou querendo fazer desse jeito mesmo… mas estou tendo dificuldades.
Tipo…

<array name="stories" cascade="all">
             <key column="parent_id"/>
             <index column="idx"/>
             <one-to-many class="Story"/>
        </array>

Eu configuerei desse jeito:

<array name="itens" cascade="all">
             <key column="id"/>
             <index column="idx"/>
             <one-to-many class="SaidaPatrimonio"/>
        </array>[/code]


E aqui:
[code]<class name="Story" table="story">
        <id name="id" unsaved-value="0">
             <generator class="increment"/>
        </id>
        <property name="info"/>
    </class>

Dessa maneira:

<class name="ItensRetirados" table="itensretirados">
        <id name="id" unsaved-value="0">
             <generator class="increment"/>
        </id>
        <property name="itens" type="string">
            <column name="itens" />
        </property>
    </class>

Então minha classe SaidaPatrimonio.hbm.xml ficou assim:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 08/11/2011 09:34:52 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="Model.SaidaPatrimonio" table="saidapatrimonio" schema="public">
        <id name="id" type="int">
            <column name="id" />
            <generator class="sequence">
                <param name="sequence">church_saidapatrimonio_id_seq</param>
            </generator>
        </id>
        <property name="dataRetirada" type="string">
            <column name="dataretirada" />
        </property>
        <property name="descricaoPatrimonio" type="string">
            <column name="descricaopatrimonio" />
        </property>
        <property name="idPatrimonio" type="java.lang.Integer">
            <column name="idpatrimonio" />
        </property>
        
        <array name="itens" cascade="all" fetch="join">  
            <key column="id"/>
            <list-index column="id"/>
            <one-to-many class="SaidaPatrimonio"/>
        </array>
        
        <property name="nomePessoaPegou" type="string">
            <column name="nomepessoapegou" />
        </property>
        <property name="quantidadeRetirada" type="long">
            <column name="quantidaderetirada" />
        </property>
    </class>
    
    
    <class name="ItensRetirados" lazy="true" table="itensretirados">
        <id name="id">
            <generator class="increment"/>
        </id>
         <property name="itens" type="string">
            <column name="itens" />
        </property>
    </class>
</hibernate-mapping>

Mas quando tento apenas abrir minha tela ele dá erro dizendo: could not parse mapping document from resource Mode/SaidaPatrimonio.hbm.xml

O que posso estar fazendo de errado??
Me ajuuudem!

cara,

vc ja pensou qdo vc for fazer alguma consulta com esses dados?

t+

Olá amigo.
Estou pensando cara, por isso to precisando da ajuda de vcs…rsrrs
Não tenho muitoa experiência com o hibernate, por isso que aprender com os amigos qual a melhor maneira pra depois não ter que ficar alterando tudo entende?
Como os amigos fariam nesse caso?

cara,

isso nao é problema de hibernate, isso vai ser problema de relacionamento do seu banco. como eu te disse seria melhor vc criar uma tabela para esse caso.

t+

Olá alissonvla.
Criei essa tabela cara, mas não estou conseguindo obter êxito no relacionamento, entende?
E também não imagino como ficaria o insert nela… Eu criei a tabela com os campos id e itens…
fiz o que vc falou mas a partir dae preciso de uma luz para saber como proceder!.
Obrigado pela força cara!

cara,

vc ta dando manutenção nesse seu projeto ou ta começando?
pq se vc tiver começando do zero, utilize anotação ao inves de xml, é mais simples de trabalhar.

t+

[quote=alissonvla]cara,

vc ta dando manutenção nesse seu projeto ou ta começando?
pq se vc tiver começando do zero, utilize anotação ao inves de xml, é mais simples de trabalhar.

t+[/quote]

Cara eu tenho um projeto feito todo em hibernate annotations, e se fosse começar hoje do zero ele de novo ia fazer tudo em XML, primeiro por achar muito mais coisa em XML do que annotations
segundo pela manutenção além de certas coisas só ser possível em XML, pelo menos foi o que descobrir quando precisava de alguma coisas mais complexa, usando annotations parecia gambiarra.

cara,

acho que isso que vc disse ser um pouco improvavel, vc conseguir resolver algum problema com xml e não com anotação.
mas gosto é gosto ne.

t+

[quote=andre_bento]Olá amigos.
Eu estou querendo fazer desse jeito mesmo… mas estou tendo dificuldades.
Tipo…

<array name="stories" cascade="all">
             <key column="parent_id"/>
             <index column="idx"/>
             <one-to-many class="Story"/>
        </array>

Eu configuerei desse jeito:

<array name="itens" cascade="all">
             <key column="id"/>
             <index column="idx"/>
             <one-to-many class="SaidaPatrimonio"/>
        </array>[/code]


E aqui:
[code]<class name="Story" table="story">
        <id name="id" unsaved-value="0">
             <generator class="increment"/>
        </id>
        <property name="info"/>
    </class>

Dessa maneira:

<class name="ItensRetirados" table="itensretirados">
        <id name="id" unsaved-value="0">
             <generator class="increment"/>
        </id>
        <property name="itens" type="string">
            <column name="itens" />
        </property>
    </class>

Então minha classe SaidaPatrimonio.hbm.xml ficou assim:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 08/11/2011 09:34:52 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="Model.SaidaPatrimonio" table="saidapatrimonio" schema="public">
        <id name="id" type="int">
            <column name="id" />
            <generator class="sequence">
                <param name="sequence">church_saidapatrimonio_id_seq</param>
            </generator>
        </id>
        <property name="dataRetirada" type="string">
            <column name="dataretirada" />
        </property>
        <property name="descricaoPatrimonio" type="string">
            <column name="descricaopatrimonio" />
        </property>
        <property name="idPatrimonio" type="java.lang.Integer">
            <column name="idpatrimonio" />
        </property>
        
        <array name="itens" cascade="all" fetch="join">  
            <key column="id"/>
            <list-index column="id"/>
            <one-to-many class="SaidaPatrimonio"/>
        </array>
        
        <property name="nomePessoaPegou" type="string">
            <column name="nomepessoapegou" />
        </property>
        <property name="quantidadeRetirada" type="long">
            <column name="quantidaderetirada" />
        </property>
    </class>
    
    
    <class name="ItensRetirados" lazy="true" table="itensretirados">
        <id name="id">
            <generator class="increment"/>
        </id>
         <property name="itens" type="string">
            <column name="itens" />
        </property>
    </class>
</hibernate-mapping>

Mas quando tento apenas abrir minha tela ele dá erro dizendo: could not parse mapping document from resource Mode/SaidaPatrimonio.hbm.xml

O que posso estar fazendo de errado??
Me ajuuudem!

[/quote]

Então,

Acho que você precisa colocar o nome do pacote, igual ao saidaPatrimonio … "Model.ItensRetirados.

e no array …

O one-to-many e para Model.ItensRetirados.

Acho que é isso …

[]'s

alissonvla
EU gosto de usar annotations, mais em pequenos projetos, coisa que me gere menos de 100 pojos…
Acima disso vou de XML mesmo

Olá amigos.
Pessoal fiz o que o amigo alex.brito me falou e ele parou o erro… até ae beleza…
Só que agora eu preciso mandar esse relacionamento que fiz no hibernate para o banco como eu faço?
E segundo, como faço para dar o insert nessa tabela itensRetirados…
Realmente não estou imaginando como…
O relacionamento é 1 Saída para N itens retirados…
Obrigado amigos

Você tentou inserir ???

 <array name="itens" cascade="all" fetch="join">    
             <key column="id"/>  
             <list-index column="id"/>  
             <one-to-many class="SaidaPatrimonio"/>  
  </array>

Pergunto isso porque esse cascade=“all”, garante que quando voce inserir e/ou atualizar e/ou excluir uma SaidaPatrimonio ele deve pegar sua lista (array) de itens retirados e executar umas dessas operações também, em cascata.

Então, você testou e não funcionou ???

[]'s

Olá amigo.
Acabo de tentar inserir e ele me volta o erro: Contraint Violation Exception
Mas minha tabela itensretirados não tem primary key… a única mudança que eu fiz foi colocar na tabela SaidaPatrimonio no campo itens eu mudei o tipo para um tipo integer para pegar o id da tabela itensretirados…
Nunca mexi com esse tipo de relação então minha dúvida é… quando eu for fazer um insert no saidaPatrimonio ele vai automaticamente fazer o insert na tabela itensRemovidos…???
Ou terei que bolar uma lógica fazer o insert na saidapatrimonio e depois no itensremovidos…
Obrigado amigos

Eu estou tentando fazer da seguinte maneira:

Na minha tela:

[code]public List getAllItems(){
Object[][] dados = model.getAllItems();
Listlist = new ArrayList();
SaidaPatrimonio s = new SaidaPatrimonio();
int tam = dados.length;
s.setNomePessoaPegou(txtNomePessoaPegou.getText());
String data = new SimpleDateFormat(“dd/MM/yyyy”).format(txtDataRetirada.getDate());
s.setDataRetirada(data);
String [] descricoes = new String [tam];
ItensRetirados [] itens = new ItensRetirados[tam];
for(int i=0;i<tam;i++){//ver aqui que está dando o erro… usar o debug para ver os valores corretos

    descricoes[i] = String.valueOf(dados[i][0]);
    
//aqui está dando nullPointerException também, não sei porque...rsrsr
    itens[i].setItens(descricoes[i]);
   
   
}
 s.setItensRetirados(itens);
    list.add(0, s);
    
   
    

return list;

}[/code]

Meu controle:

[code]if(comando.equals(“btnCadastrar”)){
try{
List lista = new ArrayList();
lista = tela.getAllItems();
SaidaPatrimonio s = new SaidaPatrimonio();
s.setDataRetirada(lista.get(0).getDataRetirada());
s.setNomePessoaPegou(lista.get(0).getNomePessoaPegou());
ItensRetirados [] itensRetirados = lista.get(0).getItensRetirados();
s.setItensRetirados(itensRetirados);

                    //s.setItensRetirados(itens);
                    DAOSaidas daoSaidas = new DAOSaidas();
                    daoSaidas.insert(s);
                    }
                    catch(Exception e){
                        JOptionPane.showMessageDialog(null,"Erro ao cadastrar a saída:"+e,"ERRO",JOptionPane.ERROR_MESSAGE);
                    }
                }[/code]

Vamos tentar assim.

Voce ja tem a classe SaidaPatrimonio, então vamos montar a ItensRetirados:

  public class ItensRetirados {  
      private int id;  
      private String item;
      private SaidaPatrimonio saidaPatrimonio;
    
      //getters and setters  
  }  

crie a tabela no banco com essas colunas. A coluna saidaPatrimonio pode ser um number, pois irá referenciar o id da tabela saidaPatrimonio.

Faça o mapeamento no seu hbm.xml. Exemplo:

 <class name="ItensRetirados" lazy="true" table="itensretirados">  
         <id name="id">  
             <generator class="increment"/>  
         </id>  
          <property name="item" type="string">  
             <column name="item" />  
         </property>
         <many-to-one name="saidaPatrimonio" class="Model.SaidaPatrimonio" column="saidaPatrimonio" not-null="true" />
   </class>

E agora, vamos mapear o array:

 <array name="itens" table="itensretirados" cascade="all">  
             <key column="id"/>  
             <index column="item"/>  
             <one-to-many class="Model.ItensRetirados"/>  
  </array>

Sobre como inserir, se seu objeto saida estiver com o array de itens preenchidos, quando voce salvar uma saida, ele ira salvar os itens retirados. Pois o cascade está ativado.

Acho que é isso. Faça essas alterações e teste.

[]'s