Well I'm using
SpringFramework for managing transaction, and creating
SessionFactory and many other things like this,
I've already followed the rules, and couldn't find the reason of my problem.
I've got two classes:
Order and
OrderItem with a bidirectional many-to-one relation. (you can see the mapping files below),
the problem is when storing an
Order the index property of
items list is not inserted, but it should.
If I make the property not-null in my database, an exception occures during insertion of the
Order, otherwise there will be an exception when querying database.
Hibernate version: 2.7.1c
Mapping documents:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<!-- com.tss.bourse.tfp.model.Order root -->
<!-- prefix: ord -->
<class name="com.tss.bourse.tfp.model.Order" table="tb_order">
<id name="id" type="long" column="ord_id">
<generator class="native"/>
</id>
<property name="sell" column="ord_is_sell" type="boolean" not-null="true"/>
<property name="date" column="ord_date" type="string" length="10"/>
<many-to-one name="person" column="ord_prs_ref" class="com.tss.bourse.tfp.model.Person" foreign-key="FK_ORD_PRS" not-null="true"/>
<list name="items" cascade="all-delete-orphan" outer-join="true" inverse="true">
<key column="ori_ord_ref" foreign-key="FK_ORI_ORD"/>
<index column="ori_index"/>
<one-to-many class="com.tss.bourse.tfp.model.OrderItem"/>
</list>
<!-- prefix: msg -->
<map name="messages" cascade="all-delete-orphan" table="tb_order_message">
<key column="msg_ord_ref" foreign-key="FK_MSG_ORD"/>
<index column="msg_key" length="50" type="string"/>
<element type="string" column="msg_text" not-null="true" length="50"/>
</map>
</class>
</hibernate-mapping>
------------------------------
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<!-- com.tss.bourse.tfp.model.OrderItem root -->
<!-- prefix: oit -->
<class name="com.tss.bourse.tfp.model.OrderItem" table="tb_order_item">
<id name="id" type="long" column="oit_id">
<generator class="native"/>
</id>
<many-to-one name="order" column="ori_ord_ref" class="com.tss.bourse.tfp.model.Order" foreign-key="FK_ORI_ORD" not-null="true" outer-join="true"/>
<property name="share" column="oit_is_share" not-null="true"/>
<many-to-one name="company" column="oit_cmp_ref" class="com.tss.bourse.tfp.model.Company" foreign-key="FK_OIT_CMP" not-null="true" outer-join="true"/>
<property name="count" column="oit_count" type="int" not-null="true"/>
<property name="extremePrice" column="oit_extreme_price" type="string" length="50" not-null="true"/>
<property name="investment" column="oit_investment" type="string" length="50"/>
</class>
</hibernate-mapping>
----------------------------------------
this is stacktrace when querying data inserted with index property with value of null:Code:
Exception occurred during event dispatching:
org.springframework.orm.hibernate.HibernateSystemException: null index column for collection: com.tss.bourse.tfp.model.Order.items; nested exception is net.sf.hibernate.HibernateException: null index column for collection: com.tss.bourse.tfp.model.Order.items
net.sf.hibernate.HibernateException: null index column for collection: com.tss.bourse.tfp.model.Order.items
at net.sf.hibernate.collection.AbstractCollectionPersister.readIndex(AbstractCollectionPersister.java:370)
at net.sf.hibernate.collection.List.readFrom(List.java:308)
at net.sf.hibernate.loader.Loader.readCollectionElement(Loader.java:380)
at net.sf.hibernate.loader.Loader.getRowFromResultSet(Loader.java:235)
at net.sf.hibernate.loader.Loader.doQuery(Loader.java:281)
at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:133)
at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:911)
at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:931)
at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:59)
at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:51)
at net.sf.hibernate.persister.EntityPersister.load(EntityPersister.java:415)
at net.sf.hibernate.impl.SessionImpl.doLoad(SessionImpl.java:2130)
at net.sf.hibernate.impl.SessionImpl.doLoadByClass(SessionImpl.java:2000)
at net.sf.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:1962)
at net.sf.hibernate.type.ManyToOneType.resolveIdentifier(ManyToOneType.java:69)
at net.sf.hibernate.type.EntityType.resolveIdentifier(EntityType.java:204)
at net.sf.hibernate.impl.SessionImpl.initializeEntity(SessionImpl.java:2218)
at net.sf.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:315)
at net.sf.hibernate.loader.Loader.doQuery(Loader.java:305)
at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:133)
at net.sf.hibernate.loader.Loader.doList(Loader.java:1033)
at net.sf.hibernate.loader.Loader.list(Loader.java:1024)
at net.sf.hibernate.hql.QueryTranslator.list(QueryTranslator.java:854)
at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1553)
at net.sf.hibernate.impl.QueryImpl.list(QueryImpl.java:39)
at com.tss.bourse.tfp.report.dao.ReportDaoImpl$1.doInHibernate(ReportDaoImpl.java:56)
at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:243)
at org.springframework.orm.hibernate.HibernateTemplate.executeFind(HibernateTemplate.java:263)
at com.tss.bourse.tfp.report.dao.ReportDaoImpl.getReport(ReportDaoImpl.java:21)
at com.tss.bourse.tfp.gui.delegate.ReportAgent.getReports(ReportAgent.java:35)
at com.tss.bourse.tfp.gui.view.SearchDialog.btnSearchActionPerformed(SearchDialog.java:329)
at com.tss.bourse.tfp.gui.view.SearchDialog.access$100(SearchDialog.java:30)
at com.tss.bourse.tfp.gui.view.SearchDialog$2.actionPerformed(SearchDialog.java:174)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)
at java.awt.Component.processMouseEvent(Component.java:5100)
at java.awt.Component.processEvent(Component.java:4897)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
at java.awt.Container.dispatchEventImpl(Container.java:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:141)
at java.awt.Dialog$1.run(Dialog.java:540)
at java.awt.Dialog.show(Dialog.java:561)
at java.awt.Component.show(Component.java:1133)
at java.awt.Component.setVisible(Component.java:1088)
at com.tss.bourse.tfp.gui.view.SearchDialog.<init>(SearchDialog.java:75)
at com.tss.bourse.tfp.gui.utils.SearchAction.actionPerformed(ToolBarBuilder.java:87)
... 24 more
and this is the stacktrace when making field in database not null during insert action:Code:
Caused by: org.springframework.dao.DataIntegrityViolationException: (Hibernate operation): data integrity violated by SQL ''; nested exception is java.sql.SQLException: Try to insert null into a non-nullable column: column: ORI_INDEX table: TB_ORDER_ITEM in statement [insert into tb_order_item (ori_ord_ref, oit_is_share, oit_cmp_ref, oit_count, oit_extreme_price, oit_investment, oit_id) values (?, ?, ?, ?, ?, ?, null)]
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.translate(SQLStateSQLExceptionTranslator.java:88)
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:281)
at org.springframework.orm.hibernate.HibernateAccessor.convertJdbcAccessException(HibernateAccessor.java:249)
at org.springframework.orm.hibernate.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:231)
at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:248)
at org.springframework.orm.hibernate.HibernateTemplate.save(HibernateTemplate.java:383)
at com.tss.utils.crud.impl.ModifiableDaoImpl.save(ModifiableDaoImpl.java:15)
at com.tss.utils.crud.impl.ModifiableDaoServiceImpl.save(ModifiableDaoServiceImpl.java:14)
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 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:296)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:56)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174)
at $Proxy1.save(Unknown Source)
at com.tss.utils.crud.impl.CachingModifiableDaoServiceImpl.save(CachingModifiableDaoServiceImpl.java:89)
at com.tss.bourse.tfp.gui.delegate.ApplicationAgent.saveOrder(ApplicationAgent.java:162)
... 26 more
Caused by: java.sql.SQLException: Try to insert null into a non-nullable column: column: ORI_INDEX table: TB_ORDER_ITEM in statement [insert into tb_order_item (ori_ord_ref, oit_is_share, oit_cmp_ref, oit_count, oit_extreme_price, oit_investment, oit_id) values (?, ?, ?, ?, ?, ?, null)]
at org.hsqldb.jdbc.jdbcUtil.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:101)
at net.sf.hibernate.persister.EntityPersister.insert(EntityPersister.java:520)
at net.sf.hibernate.persister.EntityPersister.insert(EntityPersister.java:428)
at net.sf.hibernate.impl.ScheduledIdentityInsertion.execute(ScheduledIdentityInsertion.java:29)
at net.sf.hibernate.impl.SessionImpl.doSave(SessionImpl.java:941)
at net.sf.hibernate.impl.SessionImpl.doSave(SessionImpl.java:866)
at net.sf.hibernate.impl.SessionImpl.saveWithGeneratedIdentifier(SessionImpl.java:784)
at net.sf.hibernate.impl.SessionImpl.save(SessionImpl.java:747)
at net.sf.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:1397)
at net.sf.hibernate.engine.Cascades$4.cascade(Cascades.java:114)
at net.sf.hibernate.engine.Cascades.cascade(Cascades.java:436)
at net.sf.hibernate.engine.Cascades.cascadeCollection(Cascades.java:526)
at net.sf.hibernate.engine.Cascades.cascade(Cascades.java:452)
at net.sf.hibernate.engine.Cascades.cascade(Cascades.java:503)
at net.sf.hibernate.impl.SessionImpl.doSave(SessionImpl.java:961)
at net.sf.hibernate.impl.SessionImpl.doSave(SessionImpl.java:866)
at net.sf.hibernate.impl.SessionImpl.saveWithGeneratedIdentifier(SessionImpl.java:784)
at net.sf.hibernate.impl.SessionImpl.save(SessionImpl.java:747)
at org.springframework.orm.hibernate.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:386)
at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:243)
... 42 more
Name and version of the database you are using: hsqldb 1.7.3
The generated SQL (show_sql=true):if errors occure with nullable field during select operation:Code:
Hibernate: select person2_.prs_id as prs_id0_, orderitem0_.oit_id as oit_id1_, person2_.prs_name as prs_name0_, person2_.prs_last_name as prs_last3_0_, person2_.prs_father_name as prs_fath4_0_, person2_.prs_bc_id as prs_bc_id0_, person2_.prs_birth_year as prs_birt6_0_, person2_.prs_bc_issuance_place as prs_bc_i7_0_, person2_.prs_ssn as prs_ssn0_, person2_.prs_phone as prs_phone0_, person2_.prs_post_code as prs_pos10_0_, person2_.prs_address as prs_add11_0_, person2_.prs_bourse_code as prs_bou12_0_, orderitem0_.ori_ord_ref as ori_ord_2_1_, orderitem0_.oit_is_share as oit_is_s3_1_, orderitem0_.oit_cmp_ref as oit_cmp_4_1_, orderitem0_.oit_count as oit_count1_, orderitem0_.oit_extreme_price as oit_extr6_1_, orderitem0_.oit_investment as oit_inve7_1_, person2_.prs_id as x0_0_, orderitem0_.oit_id as x1_0_, order1_.ord_date as x2_0_, order1_.ord_is_sell as x3_0_ from tb_order_item orderitem0_, tb_order order1_, tb_person person2_ where orderitem0_.ori_ord_ref=order1_.ord_id and orderitem0_.ori_ord_ref=order1_.ord_id and order1_.ord_prs_ref=person2_.prs_id and (((1=1 ))and((order1_.ord_prs_ref=? and orderitem0_.ori_ord_ref=order1_.ord_id))and((orderitem0_.oit_is_share=? ))) order by order1_.ord_id , orderitem0_.oit_id , order1_.ord_date , order1_.ord_prs_ref
Hibernate: select order0_.ord_id as ord_id3_, order0_.ord_is_sell as ord_is_s2_3_, order0_.ord_date as ord_date3_, order0_.ord_prs_ref as ord_prs_4_3_, person1_.prs_id as prs_id0_, person1_.prs_name as prs_name0_, person1_.prs_last_name as prs_last3_0_, person1_.prs_father_name as prs_fath4_0_, person1_.prs_bc_id as prs_bc_id0_, person1_.prs_birth_year as prs_birt6_0_, person1_.prs_bc_issuance_place as prs_bc_i7_0_, person1_.prs_ssn as prs_ssn0_, person1_.prs_phone as prs_phone0_, person1_.prs_post_code as prs_pos10_0_, person1_.prs_address as prs_add11_0_, person1_.prs_bourse_code as prs_bou12_0_, items2_.ori_ord_ref as ori_ord_2___, items2_.oit_id as oit_id__, items2_.ori_index as ori_index__, items2_.oit_id as oit_id1_, items2_.ori_ord_ref as ori_ord_2_1_, items2_.oit_is_share as oit_is_s3_1_, items2_.oit_cmp_ref as oit_cmp_4_1_, items2_.oit_count as oit_count1_, items2_.oit_extreme_price as oit_extr6_1_, items2_.oit_investment as oit_inve7_1_, company3_.cmp_id as cmp_id2_, company3_.cmp_symbol as cmp_symbol2_, company3_.cmp_name as cmp_name2_ from tb_order order0_ left outer join tb_person person1_ on order0_.ord_prs_ref=person1_.prs_id left outer join tb_order_item items2_ on order0_.ord_id=items2_.ori_ord_ref left outer join tb_company company3_ on items2_.oit_cmp_ref=company3_.cmp_id where order0_.ord_id=?
if error occures during insertion opertion with index field being not null:Code:
Hibernate: insert into tb_order (ord_is_sell, ord_date, ord_prs_ref, ord_id) values (?, ?, ?, null)
Hibernate: call identity()
Hibernate: insert into tb_order_item (ori_ord_ref, oit_is_share, oit_cmp_ref, oit_count, oit_extreme_price, oit_investment, oit_id) values (?, ?, ?, ?, ?, ?, null)
[/code]