Home » Modeling » EMF » One-to-one references in Teneo 1.0.1
One-to-one references in Teneo 1.0.1 [message #423824] |
Tue, 07 October 2008 15:15 |
Roland Brand Messages: 42 Registered: July 2009 |
Member |
|
|
Hi,
I have two objects referencing each other. The reference in both of them
has lower bound and upper bound set to 1. Also, EOpposite is set to the
referenced object in both references.
With Teneo 1.0.0 in Eclipse 3.4.0 this worked fine, but after updating to
Eclipse 3.4.1 and Teneo 1.0.1 I get this error:
3819 [main] DEBUG org.hibernate.util.JDBCExceptionReporter - could not
insert: [ToolComposite] [insert into "myobject1" (e_id, e_version, "name",
"dtype") values (null, ?, ?, 'MyObjects')]
java.sql.SQLException: Attempt to insert null into a non-nullable column:
column: MYOBJECT2 table: myobject1 in statement [insert into "myobject1"
(e_id, e_version, "name", "dtype") values (null, ?, ?, 'MyObjects')]
at org.hsqldb.jdbc.Util.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
at
org.hibernate.id.insert.AbstractSelectingDelegate.performIns ert(AbstractSelectingDelegate.java:57)
at
org.hibernate.persister.entity.AbstractEntityPersister.inser t(AbstractEntityPersister.java:2186)
at
org.hibernate.persister.entity.AbstractEntityPersister.inser t(AbstractEntityPersister.java:2666)
at
org.hibernate.action.EntityIdentityInsertAction.execute(Enti tyIdentityInsertAction.java:71)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:27 9)
at
org.hibernate.event.def.AbstractSaveEventListener.performSav eOrReplicate(AbstractSaveEventListener.java:321)
at
org.hibernate.event.def.AbstractSaveEventListener.performSav e(AbstractSaveEventListener.java:204)
at
org.hibernate.event.def.AbstractSaveEventListener.saveWithGe neratedId(AbstractSaveEventListener.java:130)
at
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.sav eWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener .java:210)
at
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.ent ityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
at
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.per formSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
at
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onS aveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl. java:534)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java :526)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java :522)
at
org.eclipse.emf.teneo.hibernate.HbSessionWrapper.saveOrUpdat e(HbSessionWrapper.java:161)
at
[...]
A comparison of the database schemes generated by Teneo shows, that the
foreign key field is generated in the table for myobject1 in Teneo 1.0.1,
whereas the reference was the other way round in Teneo 1.0.0.
Did I find a new bug in Teneo here, or am I doing something wrong?
Roland
|
|
|
Re: One-to-one references in Teneo 1.0.1 [message #423839 is a reply to message #423824] |
Tue, 07 October 2008 19:18 |
Martin Taal Messages: 5468 Registered: July 2009 |
Senior Member |
|
|
Hi Roland,
Indeed the mapping of the one-to-one has changed since 1.0.0, before it was not working correctly in
some cases. You can influence the location of the foreign key by setting a
@OneToOne(mappedBy="otherside") on one side, then the foreign key will be placed on the other side.
Regarding your exception, I have seen this before in the following situation. Hibernate first saves
a set of objects with the foreign key fields set to null, even for fk fields which are mandatory.
Then when the objects are saved and the ids are determined an update is used to update the foreign
key fields. However often Hibernate is smart enough to do the persist in the correct order and then
this saving with null is not happening.
How does the mapping look like for the one-to-ones on both sides?
gr. Martin
Roland Brand wrote:
> Hi,
>
> I have two objects referencing each other. The reference in both of them
> has lower bound and upper bound set to 1. Also, EOpposite is set to the
> referenced object in both references.
>
> With Teneo 1.0.0 in Eclipse 3.4.0 this worked fine, but after updating
> to Eclipse 3.4.1 and Teneo 1.0.1 I get this error:
>
> 3819 [main] DEBUG org.hibernate.util.JDBCExceptionReporter - could not
> insert: [ToolComposite] [insert into "myobject1" (e_id, e_version,
> "name", "dtype") values (null, ?, ?, 'MyObjects')]
> java.sql.SQLException: Attempt to insert null into a non-nullable
> column: column: MYOBJECT2 table: myobject1 in statement [insert into
> "myobject1" (e_id, e_version, "name", "dtype") values (null, ?, ?,
> 'MyObjects')]
> at org.hsqldb.jdbc.Util.throwError(Unknown Source)
> at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
> at
> org.hibernate.id.insert.AbstractSelectingDelegate.performIns ert(AbstractSelectingDelegate.java:57)
>
> at
> org.hibernate.persister.entity.AbstractEntityPersister.inser t(AbstractEntityPersister.java:2186)
>
> at
> org.hibernate.persister.entity.AbstractEntityPersister.inser t(AbstractEntityPersister.java:2666)
>
> at
> org.hibernate.action.EntityIdentityInsertAction.execute(Enti tyIdentityInsertAction.java:71)
>
> at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:27 9)
> at
> org.hibernate.event.def.AbstractSaveEventListener.performSav eOrReplicate(AbstractSaveEventListener.java:321)
>
> at
> org.hibernate.event.def.AbstractSaveEventListener.performSav e(AbstractSaveEventListener.java:204)
>
> at
> org.hibernate.event.def.AbstractSaveEventListener.saveWithGe neratedId(AbstractSaveEventListener.java:130)
>
> at
> org.hibernate.event.def.DefaultSaveOrUpdateEventListener.sav eWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener .java:210)
>
> at
> org.hibernate.event.def.DefaultSaveOrUpdateEventListener.ent ityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
>
> at
> org.hibernate.event.def.DefaultSaveOrUpdateEventListener.per formSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
>
> at
> org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onS aveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
>
> at
> org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl. java:534)
> at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java :526)
> at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java :522)
> at
> org.eclipse.emf.teneo.hibernate.HbSessionWrapper.saveOrUpdat e(HbSessionWrapper.java:161)
>
> at [...]
>
>
> A comparison of the database schemes generated by Teneo shows, that the
> foreign key field is generated in the table for myobject1 in Teneo
> 1.0.1, whereas the reference was the other way round in Teneo 1.0.0.
>
> Did I find a new bug in Teneo here, or am I doing something wrong?
> Roland
>
>
--
With Regards, Martin Taal
Springsite/Elver.org
Office: Hardwareweg 4, 3821 BV Amersfoort
Postal: Nassaulaan 7, 3941 EC Doorn
The Netherlands
Cell: +31 (0)6 288 48 943
Tel: +31 (0)84 420 2397
Fax: +31 (0)84 225 9307
Mail: mtaal@springsite.com - mtaal@elver.org
Web: www.springsite.com - www.elver.org
|
|
|
Re: One-to-one references in Teneo 1.0.1 [message #423877 is a reply to message #423839] |
Wed, 08 October 2008 15:00 |
Roland Brand Messages: 42 Registered: July 2009 |
Member |
|
|
Hi Martin
> Regarding your exception, I have seen this before in the following
situation. Hibernate first saves
> a set of objects with the foreign key fields set to null, even for fk fields
which are mandatory.
> Then when the objects are saved and the ids are determined an update is used
to update the foreign
> key fields. However often Hibernate is smart enough to do the persist in the
correct order and then
> this saving with null is not happening.
This is exactly, what is happening. The exception is thrown, because the
fk field is declared as non-null.
> How does the mapping look like for the one-to-ones on both sides?
In the hibernate mapping, which is generated by EMF, I see, that the
relationship is declared as many-to-one in one direction and as one-to-one
in the other direction.
<subclass name="MyObject1" ...>
<many-to-one name="myobject2" entity-name="MyObject2"
cascade="merge,persist,save-update,lock,refresh" not-null="true"
lazy="false" insert="true" update="true"/>
</subclass>
<subclass name="MyObject2" ...>
<one-to-one name="myobjectt1" entity-name="MyObject1"
cascade="merge,persist,save-update,lock,refresh" lazy="false"
property-ref="myobject2" constrained="true"/>
</subclass>
Is this the expected mapping?
Thanks for your help.
Roland
|
|
|
Re: One-to-one references in Teneo 1.0.1 [message #423889 is a reply to message #423877] |
Thu, 09 October 2008 00:58 |
Martin Taal Messages: 5468 Registered: July 2009 |
Senior Member |
|
|
Hi Roland,
Yes this is the correct mapping for a non-pk one-to-one. You can influence where the many-to-one is
placed by setting a @OneToOne(mappedBy="theotherefeature") on one side, then the many-to-one will be
on the other side (which does not have the mappedBy defined).
gr. Martin
Roland Brand wrote:
> Hi Martin
>
>> Regarding your exception, I have seen this before in the following
> situation. Hibernate first saves
>> a set of objects with the foreign key fields set to null, even for fk
>> fields
> which are mandatory.
>> Then when the objects are saved and the ids are determined an update
>> is used
> to update the foreign
>> key fields. However often Hibernate is smart enough to do the persist
>> in the
> correct order and then
>> this saving with null is not happening.
>
> This is exactly, what is happening. The exception is thrown, because the
> fk field is declared as non-null.
>
>> How does the mapping look like for the one-to-ones on both sides?
>
> In the hibernate mapping, which is generated by EMF, I see, that the
> relationship is declared as many-to-one in one direction and as
> one-to-one in the other direction.
>
> <subclass name="MyObject1" ...>
> <many-to-one name="myobject2" entity-name="MyObject2"
> cascade="merge,persist,save-update,lock,refresh" not-null="true"
> lazy="false" insert="true" update="true"/>
> </subclass>
>
> <subclass name="MyObject2" ...>
> <one-to-one name="myobjectt1" entity-name="MyObject1"
> cascade="merge,persist,save-update,lock,refresh" lazy="false"
> property-ref="myobject2" constrained="true"/>
> </subclass>
>
> Is this the expected mapping?
>
> Thanks for your help.
>
> Roland
>
>
--
With Regards, Martin Taal
Springsite/Elver.org
Office: Hardwareweg 4, 3821 BV Amersfoort
Postal: Nassaulaan 7, 3941 EC Doorn
The Netherlands
Cell: +31 (0)6 288 48 943
Tel: +31 (0)84 420 2397
Fax: +31 (0)84 225 9307
Mail: mtaal@springsite.com - mtaal@elver.org
Web: www.springsite.com - www.elver.org
|
|
| | | |
Re: One-to-one references in Teneo 1.0.1 [message #423911 is a reply to message #423904] |
Thu, 09 October 2008 15:00 |
Martin Taal Messages: 5468 Registered: July 2009 |
Senior Member |
|
|
Yes that makes a difference :-), does it work in case of join table inheritance strategy?
Because then this error is related on how the inheritance mapping is done and not on how hibernate
works with nullable references.
gr. Martin
Roland Brand wrote:
> Oh sorry, an important NOT is missing in my sentence. It seems like
> one-to-one references are NOT possible in single table.
>
>> Yes with single table, all columns from subtypes are made nullable...
>
> This is, what I would have expected, but it is declared non-null in the
> database.
>
> Greets, Roland
>
--
With Regards, Martin Taal
Springsite/Elver.org
Office: Hardwareweg 4, 3821 BV Amersfoort
Postal: Nassaulaan 7, 3941 EC Doorn
The Netherlands
Cell: +31 (0)6 288 48 943
Tel: +31 (0)84 420 2397
Fax: +31 (0)84 225 9307
Mail: mtaal@springsite.com - mtaal@elver.org
Web: www.springsite.com - www.elver.org
|
|
| |
Goto Forum:
Current Time: Tue Apr 23 05:32:16 GMT 2024
Powered by FUDForum. Page generated in 0.03616 seconds
|