7 Replies Latest reply on Feb 8, 2006 8:11 PM by Juan

    Hibernate Code Generation hbm2java (jdk5 & EJB3)

    Juan Newbie

      I have a problem with code generation(EJB3 POJOs) using JBoss 4.0.3SP1, JBoss IDE1.5 and JDK1.5. I want move the old project, which was purely built on Hibernate, into J2EE with EJB3. So i use the old ORM files (*.hbm.xml) for hibernate code generation with the following properties

       <taskdef name="hibernatetool"
       classname="org.hibernate.tool.ant.HibernateToolTask">
       <classpath refid="lib.class.path"></classpath>
       <classpath path="${build.dir}"></classpath>
       </taskdef>
       <hibernatetool destdir="${dist.dir}/new">
       <configuration>
       <fileset dir="${db.src.dir}/hbm" id="orghbm">
       <include name="*.hbm.xml"/>
       </fileset>
       </configuration>
       <hbm2java
       jdk5="true"
       ejb3="true">
       </hbm2java>
       </hibernatetool>
      


      But some auto-created EJB3 POJOs were not complete.
      Please refer to the following posts.

        • 1. Re: Hibernate Code Generation hbm2java (jdk5 & EJB3)
          Juan Newbie

          the first "unresolved" problem in many-to-many:
          the auto-created POJO:

           @ManyToMany(cascade={}, fetch=FetchType.LAZY, mappedBy="unresolved")
          
           public Set<InfondsFunds> getFunds() {
           return this.funds;
           }
          
           public void setFunds(Set<InfondsFunds> funds) {
           this.funds = funds;
           }
          
           @ManyToMany(cascade={}, fetch=FetchType.LAZY, mappedBy="unresolved")
          
           public Set<InfondsFunds> getFundsAbschluss() {
           return this.fundsAbschluss;
           }
          
           public void setFundsAbschluss(Set<InfondsFunds> fundsAbschluss) {
           this.fundsAbschluss = fundsAbschluss;
           }
          


          the used .hbm.xml file:
          ...
          <set name="funds" table="infonds_vv_funds" inverse="true" lazy="true" cascade="none">
          <meta attribute="field-description">
          Die Funds für die diese VV gilt (sprich die von diesem VP vertriebenen Funds). Hier duerfen nur funds enthalten sein, die beim vom Mandanten vertrieben werden (infonds_mandant.infonds_mandant_funds).
          </meta>
          <key column="vv_id"/>
          <many-to-many class="eu.cleversoft.infonds.ejb3.entities.InfondsFunds" column="funds_id"/>
          </set>
          ...
          ...
          <set name="fundsAbschluss" table="infonds_vv_funds_abschluss" inverse="true" lazy="true" cascade="none">
          <meta attribute="field-description">
          Die Funds für die diese VV bzgl. Abschluss Provisionen gilt (sprich die von diesem VP vertriebenen Funds). Hier duerfen nur Funds enthalten sein, die beim vom Mandanten vertrieben werden (auch infonds_mandant.infonds_mandant_funds).
          </meta>
          <key column="vv_id"/>
          <many-to-many class="eu.cleversoft.infonds.ejb3.entities.InfondsFunds" column="funds_id"/>
          </set>
          ...
          


          • 2. Re: Hibernate Code Generation hbm2java (jdk5 & EJB3)
            Juan Newbie

            The second problem, please see the red-colored text:
            The auto-created POJO:

            package eu.cleversoft.infonds.ejb3.entities;
            // Generated 05.02.2006 22:26:25 by Hibernate Tools 3.1.0 beta3
            
            import java.util.Calendar;
            import javax.persistence.Column;
            import javax.persistence.Embeddable;
            import javax.persistence.ManyToOne;
            
            @Embeddable
            public class InfondsFundsKurs implements java.io.Serializable {
             // Fields (here sould be not only 2 fiels, sould be more than 2)
             private InfondsFunds funds;
             private Calendar datum;
            
             // Constructors
            
             /** default constructor */
             public InfondsFundsKurs() {
             }
            
             /** full constructor */
             public InfondsFundsKurs(InfondsFunds funds, Calendar datum) {
             this.funds = funds;
             this.datum = datum;
             }
            
             // Property accessors
             @ManyToOne(cascade={$pojo.getCascadeType($property)},
             fetch=$pojo.getFetchType($property))
             $pojo.getHibernateCascadeTypeAnnotation($property)
             $pojo.generateJoinColumnsAnnotation($property)
            
             public InfondsFunds getFunds() {
             return this.funds;
             }
            
             public void setFunds(InfondsFunds funds) {
             this.funds = funds;
             }
             @Column(name="datum", unique=false, nullable=true, insertable=false, updatable=false)
            
             public Calendar getDatum() {
             return this.datum;
             }
            
             public void setDatum(Calendar datum) {
             this.datum = datum;
             }
            }
            


            • 3. Re: Hibernate Code Generation hbm2java (jdk5 & EJB3)
              Juan Newbie

              the used hbm.xml file for the second problem:

              <?xml version="1.0"?>
              <!DOCTYPE hibernate-mapping SYSTEM "file:D:/eclipse/eclipse_3.1.1_jboss_dali/workspace/infonds_hibernate/db/dtd/hibernate-mapping-3.0.dtd">
              <hibernate-mapping package="eu.cleversoft.infonds.ejb3.entities">
               <class name="InfondsFundsKurs" table="infonds_funds_kurs">
               <meta attribute="class-description">
               Die Kurse bzw. NAVs (Net Asset Values) der einzelnen Funds an den jeweiligen Tagen.
               @author Florian Clever
               </meta>
               <id name="fundsKursId" column="funds_kurs_id" type="java.lang.Integer">
               <meta attribute="field-description">
               Generated Primary Key.
               </meta>
               <generator class="native"/>
               </id>
               <!--
               <composite-id>
               <key-many-to-one name="funds" column="funds_id" class="eu.cleversoft.infonds.ejb3.entities.InfondsFunds"/>
               <key-property name="datum" column="datum" type="calendar"/>
               </composite-id>
               <property name="fundsKursId" column="funds_kurs_id" type="java.lang.Integer">
               <meta attribute="field-description">
               Diese Funds Kurs ID wird von MySql als Autowert generiert ohne das Hibernate es mitbekommt,
               damit wir es als Substitute PK im infonds_abrechnung_freeze verwenden k?nnen.
               </meta>
               </property>-->
               <properties name="fundsDatum">
               <many-to-one name="funds" insert="false" update="false" column="funds_id" class="eu.cleversoft.infonds.ejb3.entities.InfondsFunds"/>
               <property name="datum" insert="false" update="false" column="datum" type="calendar"/>
               </properties>
               <many-to-one name="funds" column="funds_id" class="eu.cleversoft.infonds.ejb3.entities.InfondsFunds"/>
               <property name="datum" column="datum" type="calendar"/>
               <property name="kurs" column="kurs" type="java.lang.Double">
               <meta attribute="field-description">
               Das ist der Ruecknahmepreis.
               </meta>
               </property>
               <property name="ausgabeKurs" column="ausgabeKurs" type="java.lang.Double" not-null="false"/>
               <property name="stueckzahl" column="stueckzahl" type="java.lang.Double">
               <meta attribute="field-description">
               Stueckzahl ist die Anzahl Anteile des Funds an diesem Tag.
               Bei offenen Funds fluktuiert diese im Lauf der Zeit. Bei geschlossenen ist sie konstant.
               </meta>
               </property>
               <property name="volumen" column="volumen" type="java.lang.Double"/>
               <property name="frozen" type="java.lang.Boolean">
               <formula>
               (SELECT count(*)>0 FROM
               Infonds_Abrechnung_Freeze f
               JOIN infonds_abrechnung a on a.abrechnung_id=f.abrechnung_id
               WHERE f.tabelle="infonds_funds_kurs" and f.pk_id=funds_kurs_id and not isnull(a.freigabe_am))
               </formula>
               </property>
               </class>
              </hibernate-mapping>
              


              • 4. Re: Hibernate Code Generation hbm2java (jdk5 & EJB3)
                Juan Newbie

                the 3rd problem, please refer to the red-colored text:
                the auto-created POJO:

                 @OneToMany(cascade={}, fetch=FetchType.LAZY, mappedBy="index")
                 @Cascade( {CascadeType.ALL, CascadeType.DELETE_ORPHAN} )
                
                 public Set<InfondsIndexWert> getWerte() {
                 return this.werte;
                 }
                
                 public void setWerte(Set<InfondsIndexWert> werte) {
                 this.werte = werte;
                 }
                 @ManyToMany(cascade={}, fetch=FetchType.LAZY)
                 @JoinTable(table=@Table(name="infonds_index_wert"), joinColumns = {
                 @JoinColumn(name="index_id", unique=false, nullable=false, insertable=true, updatable=false) }, inverseJoinColumns = {
                 @JoinColumn(name="wert", unique=false, nullable=false, insertable=true, updatable=false) })
                //Should be here @MapKey to be created? Is @MapKey support Date and Double?
                 public Map<Date,Double> getDateToWertMap() {
                 return this.dateToWertMap;
                 }
                
                 public void setDateToWertMap(Map<Date,Double> dateToWertMap) {
                 this.dateToWertMap = dateToWertMap;
                 }
                


                the used hbm.xml file:
                <?xml version="1.0"?>
                <!DOCTYPE hibernate-mapping SYSTEM "file:D:/eclipse/eclipse_3.1.1_jboss_dali/workspace/infonds_hibernate/db/dtd/hibernate-mapping-3.0.dtd" >
                
                <hibernate-mapping package="eu.cleversoft.infonds.ejb3.entities">
                
                 <class name="InfondsIndex" table="infonds_index">
                 <meta attribute="implement-equals">true</meta>
                 <meta attribute="class-description">
                 Indexe wie MSCI World werden hier definiert mit ihrem .
                 @author Florian Clever
                 </meta>
                 <id name="indexId" column="index_id" type="java.lang.Integer">
                 <generator class="native"/>
                 </id>
                
                 <property name="name" column="name" type="java.lang.String" length="50" not-null="true" />
                 <property name="ticker" column="ticker" type="java.lang.String" length="4">
                 <meta attribute="field-description">
                 Das Ticker Symbol des Index. Zwischen 3 und 4 Zeichen lang. Ueber den Ticker
                 werden dann bei Thompson die Indexwerte gezogen.
                 Russel 3000 Index hat z.B. RUA als Ticker
                 </meta>
                 </property>
                 <property name="dsMnemonic" column="ds_mnemonic" type="string" length="10"/>
                 <property name="datenDownloadSeit" column="daten_download_seit" type="date" not-null="true">
                 <meta attribute="field-description">
                 Vom Thompson historical server werden die Index Staende ab diesem Datum an bei uns in die DB gespeichert
                 </meta>
                 </property>
                 <property name="importRueckmeldung" column="import_rueckmeldung" type="java.lang.String" length="200">
                 <meta attribute="field-description">
                 Wenn der Thompson Datastream import z.B. keine Daten zu diesem Ticker findet oder der Ticker nicht existiert,
                 dann wird das hier vermerkt und dem Benutzer angezeigt.
                 </meta>
                 </property>
                 <property name="type" column="type" type="java.lang.String" length="1"/>
                 <set name="werte"
                 table="infonds_index_wert"
                 inverse="true"
                 cascade="all-delete-orphan"
                 fetch="select">
                 <key column="index_id"/>
                 <one-to-many class="eu.cleversoft.infonds.ejb3.entities.InfondsIndexWert"/>
                 </set>
                 <map name="dateToWertMap"
                 table="infonds_index_wert">
                 <key column="index_id"/>
                 <map-key column="datum" type="date"/>
                 <element column="wert" type="java.lang.Double" not-null="true"/>
                 </map>
                
                 </class>
                 <class name="InfondsFundsBenchmark" table="infonds_funds_benchmark">
                
                 <id name="fundsBenchmarkId" column="funds_benchmark_id" type="java.lang.Integer">
                 <generator class="native"/>
                 </id>
                
                 <many-to-one name="funds" column="funds_id" class="eu.cleversoft.infonds.ejb3.entities.InfondsFunds"/>
                 <many-to-one name="index" column="index_id" class="eu.cleversoft.infonds.ejb3.entities.InfondsIndex"/>
                
                 <property name="anteile" type="double"/>
                 <property name="anteilsprozent" type="double"/>
                 </class>
                </hibernate-mapping>
                


                • 5. Re: Hibernate Code Generation hbm2java (jdk5 & EJB3)
                  Juan Newbie

                  the 4th problem, same like the 2nd problem:
                  the auto-created POJO:

                  package eu.cleversoft.infonds.ejb3.entities;
                  import javax.persistence.Embeddable;
                  import javax.persistence.ManyToOne;
                  
                  (Does JBossAS4.0.3SP1 support not @Embeddable? Because If i correct it here @Entity@Table(name="infonds_zahlung")), it then runs in JBossAS wenn i deploy it)
                  
                   @Embeddable
                  public class InfondsZahlung implements java.io.Serializable {
                  
                   // Fields (Here should be more than 2 fields created)
                   private InfondsAbrechnung abrechnung;
                   private InfondsKonto konto;
                  
                   // Constructors
                  
                   /** default constructor */
                   public InfondsZahlung() {
                   }
                  
                   /** full constructor */
                   public InfondsZahlung(InfondsAbrechnung abrechnung, InfondsKonto konto) {
                   this.abrechnung = abrechnung;
                   this.konto = konto;
                   }
                  
                   // Property accessors
                   @ManyToOne(cascade={$pojo.getCascadeType($property)},
                   fetch=$pojo.getFetchType($property))
                   $pojo.getHibernateCascadeTypeAnnotation($property)
                   $pojo.generateJoinColumnsAnnotation($property)
                  
                   public InfondsAbrechnung getAbrechnung() {
                   return this.abrechnung;
                   }
                  
                   public void setAbrechnung(InfondsAbrechnung abrechnung) {
                   this.abrechnung = abrechnung;
                   }
                   @ManyToOne(cascade={$pojo.getCascadeType($property)},
                   fetch=$pojo.getFetchType($property))
                   $pojo.getHibernateCascadeTypeAnnotation($property)
                   $pojo.generateJoinColumnsAnnotation($property)
                  
                   public InfondsKonto getKonto() {
                   return this.konto;
                   }
                  
                   public void setKonto(InfondsKonto konto) {
                   this.konto = konto;
                   }
                  }
                  


                  the used hbm.xml file:
                  <?xml version="1.0"?>
                  <!DOCTYPE hibernate-mapping SYSTEM "file:D:/eclipse/eclipse_3.1.1_jboss_dali/workspace/infonds_hibernate/db/dtd/hibernate-mapping-3.0.dtd">
                  <hibernate-mapping package="eu.cleversoft.infonds.ejb3.entities">
                   <class name="InfondsZahlung" table="infonds_zahlung">
                   <meta attribute="implement-equals">true</meta>
                   <meta attribute="class-description">
                   Die tatsaechlichen Zahlungen an Vertriebspartner
                   @author Florian Clever
                   </meta>
                   <id name="zahlungId" column="zahlung_id" type="java.lang.Integer">
                   <generator class="native"/>
                   </id>
                   <many-to-one name="abrechnung" class="eu.cleversoft.infonds.ejb3.entities.InfondsAbrechnung" column="abrechnung_id" not-null="true"/>
                   <many-to-one name="partner" class="eu.cleversoft.infonds.ejb3.entities.InfondsPartner" column="partner_id" not-null="true">
                   <meta attribute="field-description">
                   Redundant da über Konto gegeben.
                   </meta>
                   </many-to-one>
                   <many-to-one name="konto" class="eu.cleversoft.infonds.ejb3.entities.InfondsKonto" column="konto_id" not-null="true">
                   <meta attribute="field-description"/>
                   </many-to-one>
                   <property name="betrag" column="betrag" type="java.lang.Double" not-null="true">
                   <meta attribute="field-description">
                   Der in dieser Abrechnung enthaltene Zahlbetrag in Euro.
                   </meta>
                   </property>
                   <property name="betragGezahlt" column="betrag_gezahlt" type="java.lang.Double" not-null="true">
                   <meta attribute="field-description">
                   Der insgesamt bereits gezahlte Betrag zum Zeitpunkt der Ueberweisungserstellung.
                   </meta>
                   </property>
                   <property name="betragZahlschuldGesamt" column="betrag_zahlschuld_gesamt" type="java.lang.Double" not-null="true">
                   <meta attribute="field-description">
                   Der aus allen bisherigen Abrechnungen inklusiver dieser hier und Ueberweisungen zu zahlende Betrag in diesem Jahr.
                   </meta>
                   </property>
                   <property name="betragNochZuZahlen" column="betrag_noch_zu_zahlen" type="java.lang.Double" not-null="true">
                   <meta attribute="field-description">
                   Netto noch zu zahlender Betrag.
                   Der aus allen bisherigen Abrechnungen inklusiver dieser hier und Ueberweisungen noch zu zahlende Betrag in diesem Jahr.
                   </meta>
                   </property>
                   <property name="generiertAm" column="generiert_am" type="java.util.Date">
                   <meta attribute="field-description">
                   Wird verwendet um zu identifizieren welche Saetze nicht geupdatet wurden und somit rausgeschmissen werden.
                   </meta>
                   </property>
                   <property name="gutschriftNr" column="gutschrift_nr" type="java.lang.Integer">
                   <meta attribute="field-description">
                   Die Gutschriftnr.
                   </meta>
                   </property>
                   <property name="rechnungNr" column="rechnung_nr" type="java.lang.String">
                   <meta attribute="field-description">
                   Die Rechnungsnr. Falls gesetzt darf die Gutschriftnr nicht gesetzt werden.
                   Die Rechnungsnr. wird gesetzt wenn VPs eine Rechnung stellen.
                   </meta>
                   </property>
                   <properties name="abrechnungKontoJoinField">
                   <many-to-one name="abrechnung" insert="false" update="false" column="abrechnung_id" class="eu.cleversoft.infonds.ejb3.entities.InfondsAbrechnung"/>
                   <many-to-one name="konto" insert="false" update="false" column="konto_id" class="eu.cleversoft.infonds.ejb3.entities.InfondsKonto"/>
                   </properties>
                   <many-to-one name="ueberweisung" class="eu.cleversoft.infonds.ejb3.entities.InfondsUeberweisung" column="ueberweisung_id" not-null="false" not-found="ignore">
                   <meta attribute="field-description">
                   Falls Ueberweisungen erstellt wurden, werden diese hier referenziert.
                   </meta>
                   </many-to-one>
                   <set name="fundsZahlungen" cascade="all-delete-orphan">
                   <key column="zahlung_id"/>
                   <one-to-many class="InfondsZahlungFunds"/>
                   </set>
                   </class>
                  </hibernate-mapping>
                  


                  • 6. Re: Hibernate Code Generation hbm2java (jdk5 & EJB3)
                    Juan Newbie

                    the 5th problem:
                    the auto-created POJO:

                     @OneToMany(cascade={}, fetch=FetchType.LAZY, mappedBy="unresolved")
                     @Cascade( {CascadeType.ALL, CascadeType.DELETE_ORPHAN} )
                    //should be here @MapKey creatd?
                     public Map<String,SodiaxFieldChangeEntry> getFieldChanges() {
                     return this.fieldChanges;
                     }
                    
                     public void setFieldChanges(Map<String,SodiaxFieldChangeEntry> fieldChanges) {
                     this.fieldChanges = fieldChanges;
                     }
                    

                    the used hbm.xml file:
                    <?xml version="1.0"?>
                    <!DOCTYPE hibernate-mapping SYSTEM "file:D:/eclipse/eclipse_3.1.1_jboss_dali/workspace/infonds_hibernate/db/dtd/hibernate-mapping-3.0.dtd" >
                    <hibernate-mapping package="eu.cleversoft.infonds.ejb3.entities">
                     <class name="SodiaxEntityChangeEntry" table="sodiax_entity_change_entry">
                     <id name="changeId" column="change_id" type="java.lang.Integer">
                     <generator class="native"/>
                     </id>
                     <many-to-one name="transaction" class="eu.cleversoft.infonds.ejb3.entities.SodiaxTransactionLog" column="transaction_id" />
                    <property name="entityKey" column="entity_key" type="java.lang.String" />
                    <property name="type" column="type" type="java.lang.String" />
                    
                    <map name="fieldChanges" table="sodiax_field_change" inverse="true" cascade="all-delete-orphan">
                    <key column="change_id"/>
                    <map-key column="field" type="string"/>
                    <one-to-many class="eu.cleversoft.infonds.ejb3.entities.SodiaxFieldChangeEntry"/>
                    </map>
                    </class>
                    </hibernate-mapping>
                    


                    • 7. Re: Hibernate Code Generation hbm2java (jdk5 & EJB3)
                      Juan Newbie

                      all of hbm.xml files runs in old hibernate correctly. Are these problems normal-bugs in JBossAS? If so, would they be so resolved in next JBoss Release Version? and Wenn?

                      Thanks a lot for your feedbacks!
                      Juan