Problemas com XDoclet e Hibernate com composite-ids

4 respostas
Alexandre

Ola pessoALL,
estou utilizando o XDoclet para fazer os meus mapeamentos O/R utilizando Hibernate, ele gera tranquilamente, mas quando eu caio no caso de ter um objeto, que atua como a chave primária de outro objeto, como no exemplo abaixo:

public class CotaCaracteristicaComponentePK extends Identity {
    private Long componenteId;
    private Long caracteristicaComponenteId;

    /**
     * @hibernate.property column="COMPONENTE_ID"
     */
    public Long getComponenteId() {
        return componenteId;
    }
    
    public void setComponenteId(Long componenteId) {
        this.componenteId = componenteId;
    }

    /**
     * @hibernate.property column="CARACT_COMPONENTE_ID"
     */
    public Long getCaracteristicaComponenteId() {
        return caracteristicaComponenteId;
    }
    
    public void setCaracteristicaComponenteId(Long caracteristicaComponenteId) {
        this.caracteristicaComponenteId = caracteristicaComponenteId;
    }
}

A classe acima representa a chave primária do objeto “CotaCaracteristicaComponente”, abaixo:

/**
 * @hibernate.class table="TB_GLB_ISP_PROD_COMPCARAC_XREF"
 */
public class CotaCaracteristicaComponente extends BusinessObject {

    private CotaCaracteristicaComponentePK id;
    private String cota;
    
    /**
     * @hibernate.id
     */
    public CotaCaracteristicaComponentePK getId() {
        return id;
    }
    
    public void setId(CotaCaracteristicaComponentePK id) {
        this.id = id;
    }
    
    /**
     * @hibernate.property column="VALOR_TXT"
     */
    public String getCota() {
        return cota;
    }
    
    public void setCota(String cota) {
        this.cota = cota;
    }
}

Quando o XDoclet vai gerar este mapeamento, ele da o seguinte erro:

com.globo.kernel.model.bo.caracteristica.CotaCaracteristicaComponente
Invoking method failed: xdoclet.modules.hibernate.HibernateTagsHandler.ifHasCompositeId, line=107 of template file: jar:file:glb17corp	ecnologiaisp
epositoryxdocletjarsxdoclet-hibernate-module-1.2.jar!/xdoclet/modules/hibernate/resources/hibernate.xdt
java.lang.reflect.InvocationTargetException
        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:324)
        at xdoclet.template.TemplateEngine.invoke(TemplateEngine.java:635)
        at xdoclet.template.TemplateEngine.invokeMethod(TemplateEngine.java:561)

        at xdoclet.template.TemplateEngine.invokeBlockMethod(TemplateEngine.java:959)
        at xdoclet.template.TemplateEngine.handleBlockTag(TemplateEngine.java:926)
        at xdoclet.template.TemplateEngine.handleTag(TemplateEngine.java:466)
        at xdoclet.template.TemplateEngine.generate(TemplateEngine.java:347)
        at xdoclet.template.TemplateEngine.start(TemplateEngine.java:414)
        at xdoclet.TemplateSubTask.startEngine(TemplateSubTask.java:560)
        at xdoclet.TemplateSubTask.generateForClass(TemplateSubTask.java:767)
        at xdoclet.TemplateSubTask.startProcessPerClass(TemplateSubTask.java:667)
        at xdoclet.TemplateSubTask.startProcess(TemplateSubTask.java:594)
        at xdoclet.XmlSubTask.startProcess(XmlSubTask.java:198)
        at xdoclet.modules.hibernate.HibernateSubTask.execute(HibernateSubTask.java:123)
        at xdoclet.XDocletMain.start(XDocletMain.java:48)
        at xdoclet.DocletTask.start(DocletTask.java:464)
        at xjavadoc.ant.XJavadocTask.execute(XJavadocTask.java:110)
        at org.apache.tools.ant.Task.perform(Task.java:341)
        at
org.apache.commons.jelly.tags.ant.AntTag.doTag(AntTag.java:232)
        at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:279)
        at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:135)
        at org.apache.maven.jelly.tags.werkz.MavenGoalTag.runBodyTag(MavenGoalTag.java:79)
        at org.apache.maven.jelly.tags.werkz.MavenGoalTag$MavenGoalAction.performAction(MavenGoalTag.java:110)
        at com.werken.werkz.Goal.fire(Goal.java:639)
        at com.werken.werkz.Goal.attain(Goal.java:575)
        at com.werken.werkz.Goal.attainPrecursors(Goal.java:488)
        at com.werken.werkz.Goal.attain(Goal.java:573)
        at com.werken.werkz.WerkzProject.attainGoal(WerkzProject.java:193)
        at org.apache.maven.jelly.tags.werkz.MavenAttainGoalTag.doTag(MavenAttainGoalTag.java:127)
        at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:279)
        at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:135)
        at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:233)
        at com.werken.werkz.jelly.PreGoalTag$1.firePreGoal(PreGoalTag.java:87)
        at com.werken.werkz.Goal.firePreGoalCallbacks(Goal.java:691)
        at com.werken.werkz.Goal.fire(Goal.java:616)
        at com.werken.werkz.Goal.attain(Goal.java:575)
        at com.werken.werkz.WerkzProject.attainGoal(WerkzProject.java:193)
        at org.apache.maven.plugin.PluginManager.attainGoals(PluginManager.java:634)
        at org.apache.maven.MavenSession.attainGoals(MavenSession.java:266)
        at org.apache.maven.cli.App.doMain(App.java:486)
        at org.apache.maven.cli.App.main(App.java:1215)
        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:324)
        at com.werken.forehead.Forehead.run(Forehead.java:551)
        at com.werken.forehead.Forehead.main(Forehead.java:581)
Caused by: java.lang.NullPointerException
        at xdoclet.modules.hibernate.HibernateTagsHandler.hasCompositeId_Impl(HibernateTagsHandler.java:529)
        at xdoclet.modules.hibernate.HibernateTagsHandler.ifHasCompositeId(HibernateTagsHandler.java:140)
        ... 50 more

Alguém já passou por esse erro e pode me ajudar? Estou utilizando o maven.

Obrigado.

4 Respostas

C

Olá Alexandre,

Faltou o parâmetro generator-class que é obrigatório do comando @hibernate.id, dá uma olhada no link abaixo:

http://xdoclet.sourceforge.net/xdoclet/tags/hibernate-tags.html#@hibernate_id__0__1_

Exemplo que rodou beleza. 8)

/**
	 * @hibernate.id
	 * 		column="id"
	 * 		generator-class="vm"
	 * 		unsaved-value="null"

Espero tê-lo ajudado.

Até mais.
Fabrício Luis
http://www.ce3po.com

Alexandre

Obrigado Fabrício,
mas mesmo colocando esses parâmetros, continuo com o mesmo erro?

Pode me informar a sua versão do Maven e do Ant, por favor?

C

Olá Alexandre,

Eu não uso o Maven, até queria saber como usa e qual o benefício dele.
Parece ser legal.

O ANT é o 1.6.1.

Você disse que está fazendo um relacionamento entre classes a serem persistidas. Mas uma coisa que é importante é saber se o relacionamento será de 1-1 (one-to-one), 1-N (one-to-many) ou N-1 (many-to-one).
Uma outra idéia é que você já está fazendo uma herança e neste caso
a classe pai precisa ser também referenciada pelo Hibernate.
Por favor, veja neste site abaixo, um tutorial muito bacana sobre a forma de fazer vários tipos de relacionamentos usando o XDoclet e o Hibernate.

http://www.downside.ch/hibernate/

Espero tê-lo ajudado. 8)

Até mais.
Fabrício Luis
http://www.ce3po.com

Lelis_el_Quatilas

Olá Alexandre!

Ficou faltando você implementar os métodos equals() e hashCode() do seu composite id.

Acho que estou mais de 2 anos atrasado, mas fica ae registrado pra quem mais tiver o problema de novo…

Criado 4 de novembro de 2004
Ultima resposta 23 de jan. de 2007
Respostas 4
Participantes 3