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.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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">
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.
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
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
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
Hello,
Yes! Now it works!
Thanks for help.
Berst regards,
Radoslaw