Menu

How to force key value?

Radoslaw
2006-10-25
2012-11-26
  • Radoslaw

    Radoslaw - 2006-10-25

    Hello,

    This is my first post to this forum, so at first I would like to thank all developers who are working on this project for their good work!
    I'm using OpenXava for a few weeks and I'm very impressed by its capabilities.

    Unfortunately now I have one big problem. I can't add rows to tables when I'm trying to set key value from interface (this situation applies to my dictionary tables, which don't have autogenerated keys - for instance currency codes definitions).

    I'm using newest OX (2.0.3), Jboss (4.0.4) and Liferay (newest).

    In jboss'es log I'm getting such error trace when I'm trying to put currency code definition:
    ---------
    2006-10-25 21:42:27,556 ERROR [STDERR] org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.mymodel.CurrCodes
        at org.hibernate.id.Assigned.generate(Assigned.java:33)
        at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:91)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
        at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
        at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
        at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:530)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:518)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:514)
        at org.openxava.model.impl.HibernatePersistenceProvider.persist(HibernatePersistenceProvider.java:33)
        at org.openxava.model.impl.BasePOJOPersistenceProvider.create(BasePOJOPersistenceProvider.java:156)
        at org.openxava.model.impl.MapFacadeBean.create(MapFacadeBean.java:695)
        at org.openxava.model.impl.MapFacadeBean.create(MapFacadeBean.java:38)
        at org.openxava.model.MapFacade.create(MapFacade.java:73)
        at org.openxava.actions.SaveAction.execute(SaveAction.java:24)
        at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:309)
        at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:238)
        at org.openxava.controller.ModuleManager.execute(ModuleManager.java:205)
        at org.apache.jsp.WEB_002dINF.jsp.xava.module_jsp._jspService(module_jsp.java:327)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)

    [--CUT---]

    I have been looking into MapFacadeBean's code and I've found that (probably) it is not possible to "manually" set data to calculated fields (so also to keys, which are by default generated) at all.

    So how to solve this problem without creating "normal" autogenerated, hidden id?

    Radoslaw.

     
    • Javier Paniza

      Javier Paniza - 2006-10-26

      Hi Radoslaw,

      > I can't add rows to tables when ... don't have autogenerated keys

      It must to work. In fact, originally OpenXava was used against legate AS/400 tables, and RPG programmer are not used to autogenerated keys.

      Surely, your problem is some little detail.

      Please, put here your Currency.xml (or other component that fails) and I'll help you to find the error.

      Cheers
      Javi

       
    • Radoslaw

      Radoslaw - 2006-10-26

      Hello,

      Here is my component code:

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE component SYSTEM "dtds/component.dtd" >
      <!-- verified -->
      <component name="CurrCodes">
        <entity>           
              <property name="code" type="String" required="true" key="true" size="3">
                  <default-value-calculator class="com.mymodel.calculators.EmptyHibernateCalculator" on-create="true"></default-value-calculator>   
              </property>
              <property name="description" type="String" size="4000"></property>
        </entity>
       
       
        <entity-mapping table="PVN_CURR_CODES">       
              <property-mapping column="CODE" property="code"></property-mapping>
              <property-mapping column="DESCR" property="description"></property-mapping>

        </entity-mapping>
      </component>

      -------

      EmptyHibernateCalculator is sumple class which forces OX to generate table's id in .hbm.xml file with <generator class="assigned" />. I noticed that without that, OX autogenerated key values (it was very strange at first sight, because it set int numbers to string IDs).

      So here is generated hbm file:

      ---------

      <?xml version="1.0" encoding="ISO-8859-1"?>

      <!-- Generated by OpenXava: Wed Oct 25 23:07:26 CEST 2006 -->

      <!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

      <hibernate-mapping package="com.mymodel">

        <class
            name="CurrCodes"
            table="PVN_CURR_CODES">    
              <id name="code" column="CODE" access="field" type='java.lang.String' length='3'>
                  <generator class="assigned" />
              </id>    
              <property name="description" column="DESCR" access="field" type='java.lang.String' length='4000'/>
        </class>

      </hibernate-mapping>

      -----------

      I hope somewhere there is really silly error in my code, so I won't be necessary to redesign my tables.

      Best regards,
      Radoslaw

       
      • Javier Paniza

        Javier Paniza - 2006-10-26

        Hi Radoslaw,

        don't use default-value-calculator.

        Default value calculators are for autogenerated keys only.

        Simply, change your code:

        <property name="code" type="String" required="true" key="true" size="3">
        <default-value-calculator class="com.mymodel.calculators.EmptyHibernateCalculator" on-create="true"></default-value-calculator> 
        </property>

        by

        <property name="code" type="String" required="true" key="true" size="3"/>

        And your code will work fine.

        Cheers
        Javi

         
    • Radoslaw

      Radoslaw - 2006-10-26

      Hello,

      Yes! Now it works!

      Thanks for help.

      Berst regards,
      Radoslaw

       

Log in to post a comment.