Salvar Array no BD com Hibernate

1 resposta
eduardo.vianna

Ola pessoal, estou tendo alguns problemas quando tendo jogar um array no meu banco de dados. Eu tenho uma classe Mensagem que possui um array de um objetos Anexos[].
No banco de dados, eu tenho uma tabela mensagem e uma tabela anexos com a chave estrangeira apontando pra mensagens, acredito que seja um relacionamento de um pra muitos.

minha classe Mensagem:

public class MensagemVO {

    private String usuario,  para,  cc,  bcc,  mensagem,  assunto, enviada;
    private AnexoVO[] anexos;
    private int msgId, isOn;

    public int getMsgId() {
        return msgId;
    }

    public void setMsgId(int msgId) {
        this.msgId = msgId;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public String getPara() {
        return para;
    }

    public void setPara(String para) {
        this.para = para;
    }

    public String getCc() {
        return cc;
    }

    public void setCc(String cc) {
        this.cc = cc;
    }

    public String getBcc() {
        return bcc;
    }

    public void setBcc(String bcc) {
        this.bcc = bcc;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    public String getAssunto() {
        return assunto;
    }

    public void setAssunto(String assunto) {
        this.assunto = assunto;
    }

    public String getEnviada() {
        return enviada;
    }

    public void setEnviada(String enviada) {
        this.enviada = enviada;
    }

    public int getIsOn() {
        return isOn;
    }

    public void setIsOn(int isOn) {
        this.isOn = isOn;
    }

    public AnexoVO[] getAnexos() {
        return anexos;
    }

    public void setAnexos(AnexoVO[] anexos) {
        this.anexos = anexos;
    }



}

e meu xml mapeando esta classe:

<hibernate-mapping>
    <class name="br.com.feu.vo.MensagemVO" table="mensagem">
        <id column="msgId" name="msgId" type="integer" unsaved-value="null">
            <generator class="increment"/>
        </id>
        <property name="usuario" type="string"/>
        <property name="para" type="string"/>
        <property name="cc" type="string"/>
        <property name="bcc" type="string"/>
        <property name="mensagem" type="string"/>
        <property name="assunto" type="string"/>
        <property name="enviada" type="string"/>
        <property name="isOn" type="integer"/>
        <primitive-arrayarray name="anexos" table="anexos" cascade="all">
            <key column="idAnexos" foreign-key="msgId"/>
            <one-to-many class="br.com.feu.vo.AnexoVO" />
        </primitive-arrayarray>
    </class>
</hibernate-mapping>

sempre que eu tento gravar no banco recebo o seguinte erro:

INFO: Reading mappings from resource : message.hbm.xml
31/10/2008 21:31:03 org.hibernate.util.XMLHelper$ErrorLogger error
SEVERE: Error parsing XML: XML InputStream(19) The content of element type "array" must match "(meta*,subselect?,cache?,synchronize*,comment?,key,(index|list-index),(element|one-to-many|many-to-many|composite-element|many-to-any),loader?,sql-insert?,sql-update?,sql-delete?,sql-delete-all?)".
31/10/2008 21:31:03 com.sun.faces.application.ActionListenerImpl processAction
SEVERE: java.lang.ExceptionInInitializerError
javax.faces.el.EvaluationException: java.lang.ExceptionInInitializerError
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:91)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
        at javax.faces.component.UICommand.broadcast(UICommand.java:383)
        at org.ajax4jsf.framework.ajax.AjaxViewRoot.processEvents(AjaxViewRoot.java:180)
        at org.ajax4jsf.framework.ajax.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:158)
        at org.ajax4jsf.framework.ajax.AjaxViewRoot.processApplication(AjaxViewRoot.java:346)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
        at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ExceptionInInitializerError
        at br.com.feu.util.ConnectionFactory.<clinit>(ConnectionFactory.java:25)
        at br.com.feu.dao.MensagemDAO.salvar(MensagemDAO.java:54)
        at br.com.feu.model.InfoManager.recDB(InfoManager.java:63)
        at br.com.feu.model.InfoManager.sendMessage(InfoManager.java:33)
        at br.com.feu.model.FeuModel.sendPackage(FeuModel.java:57)
        at br.com.feu.model.FeuModel.prepareAndSend(FeuModel.java:20)
        at br.com.feu.controller.MessageController.create(MessageController.java:61)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.el.parser.AstValue.invoke(AstValue.java:172)
        at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
        at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
        ... 21 more
Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from resource message.hbm.xml
        at org.hibernate.cfg.Configuration.addResource(Configuration.java:569)
        at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1587)
        at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1555)
        at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1534)
        at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1508)
        at org.hibernate.cfg.Configuration.configure(Configuration.java:1428)
        at br.com.feu.util.ConnectionFactory.<clinit>(ConnectionFactory.java:21)
        ... 35 more
Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from invalid mapping
        at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:502)
        at org.hibernate.cfg.Configuration.addResource(Configuration.java:566)
        ... 41 more

agradeço qualquer ajuda.

1 Resposta

eduardo.vianna

galera, só pra corrigir, meu mapeamento esta assim:

<hibernate-mapping>
    <class name="br.com.feu.vo.MensagemVO" table="mensagem">
        <id column="msgId" name="msgId" type="integer" unsaved-value="null">
            <generator class="increment"/>
        </id>
        <property name="usuario" type="string"/>
        <property name="para" type="string"/>
        <property name="cc" type="string"/>
        <property name="bcc" type="string"/>
        <property name="mensagem" type="string"/>
        <property name="assunto" type="string"/>
        <property name="enviada" type="string"/>
        <property name="isOn" type="integer"/>
        <bag name="anexos" table="anexos" cascade="all-delete-orphan" lazy="false">
            <key column="idAnexos" foreign-key="msgId"/>
            <one-to-many class="br.com.feu.vo.AnexoVO" />
        </bag>
    </class>
</hibernate-mapping>
Criado 31 de outubro de 2008
Ultima resposta 3 de nov. de 2008
Respostas 1
Participantes 1