[hibernate-dev] org.hibernate.PropertyValueException: not-null property references a null or transient value
Claude Houle
choule at 8d.com
Fri Jan 22 11:58:23 EST 2010
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hello All,
I've been tracking an issue that has been causing us some trouble
regarding annotation-based hibernate mappings. The exception occurs at
run-time only:
/org.hibernate.PropertyValueException: not-null property references a
null or transient value ...
/
At first I believed we had an issue with our entity mapping was faulty
and went to try and figure it out... However, I came accross several
examples on the wide internet and showed that my mapping seems
correct. Furthermore, I had some other entities mapped in a similar
fashion that did not cause any issue... How could that be?
I traced the Hibernate code to a class named
org.hibernate.cfg.OneToOneSecondPass (Hibernate Annotations 3.4.0.GA
for those interested to look at the code) up to line 147:
...
Iterator it = otherSide.getJoinIterator();
Join otherSideJoin = null;
while ( it.hasNext() ) {
otherSideJoin = (Join) it.next();
if ( otherSideJoin.containsProperty( otherSideProperty ) ) {
break;
}
}
if ( otherSideJoin != null ) {
...
}
...
If you look closely, it seems that if there are JOINs but none
contains the otherSideProperty, the variable otherSideJoin will not be
null and will contains the last joins of the iterator even if it is
not valid.
The patched-up code would look like:
...
Iterator it = otherSide.getJoinIterator();
Join otherSideJoin = null;
while ( it.hasNext() ) {
Join otherSideJoinValue = (Join) it.next();
if ( otherSideJoinValue.containsProperty( otherSideProperty ) ) {
otherSideJoin = otherSideJoinValue;
break;
}
}
if ( otherSideJoin != null ) {
...
}
...
To fix my issue, I applied this patch:
Index: src/main/java/org/hibernate/cfg/OneToOneSecondPass.java
===================================================================
- --- src/main/java/org/hibernate/cfg/OneToOneSecondPass.java
(revision 18572)
+++ src/main/java/org/hibernate/cfg/OneToOneSecondPass.java
(working copy)
@@ -146,8 +146,9 @@
Iterator it = otherSide.getJoinIterator();
Join otherSideJoin = null;
while ( it.hasNext() ) {
- - otherSideJoin = (Join) it.next();
- - if ( otherSideJoin.containsProperty(
otherSideProperty ) ) {
+ Join otherSideJoinValue = (Join) it.next();
+ if ( otherSideJoinValue.containsProperty(
otherSideProperty ) ) {
+ otherSideJoin = otherSideJoinValue;
break;
}
}
I compiled the code locally and re-tried my failing code and it worked
beautifully. it seemed that my last joins in the iterator has a
nullable = false which caused the runtime
/org.hibernate.PropertyValueException: not-null property references a
null or transient value/
In all honesty, there are plenty of existing bug-reports where this
particular issue could fit:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-4344
http://opensource.atlassian.com/projects/hibernate/browse/ANN-556
Thanks,
- --
Claude Houle
8D Technologies inc.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (Darwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iEYEARECAAYFAktZ2S8ACgkQlk+F7nx+VYtQHQCgp4EH1Ey0h/kbMbeE7hCUJBLG
broAnAgq3ZuMC79MlN9njfR8x9yK05R1
=7xV5
-----END PGP SIGNATURE-----
More information about the hibernate-dev
mailing list