I'm not sure if this is a genuine bug or if I'm doing something wrong, but I
thought I'd check here before I open a JIRA.

BaseEntity is a @MappedSuperclass which holds only an id property
Address is an @Entity which extends BaseAddress and holds values for
streetAddress, city, state, zip.  It also has a property called geocode
which is an @Embedded type (see next)
Geocode is an @Embeddable which is embedded inside Address and holds values
for the latitude and longitude values

Go here to see the actual code for the JPA objects:

http://trac2.assembla.com/d5Z24gWSer3lvHabIlDkbG/browser/OpenJPA/EmbeddableTest/src/entity

Now, in my test java application, I attempt to create a new Address
providing values for streetAddress, city, state, zip but not specifying
anything for geocode:

http://trac2.assembla.com/d5Z24gWSer3lvHabIlDkbG/browser/OpenJPA/EmbeddableTest/src/runtime/JpaTest.java?rev=32

When I attempt to persist this Address object, I get an
InvalidStateException.  Here is the log:

47  CustomerTest  INFO   [main] openjpa.Runtime - Starting OpenJPA
1.1.0-SNAPSHOT
156  CustomerTest  INFO   [main] openjpa.jdbc.JDBC - Using dictionary class
"org.apache.openjpa.jdbc.sql.DerbyDictionary".
1469  CustomerTest  WARN   [main] openjpa.MetaData - No setter was found for
method longtitude in type entity.Geocode while searching for persistent
properties. This method will be ignored. If you intended for this to be
persistent, please add a corresponding setter, or switch to field access for
this type hierarchy.
1484  CustomerTest  WARN   [main] openjpa.MetaData - No setter was found for
method longtitude in type entity.Geocode while searching for persistent
properties. This method will be ignored. If you intended for this to be
persistent, please add a corresponding setter, or switch to field access for
this type hierarchy.
1656  CustomerTest  INFO   [main] openjpa.Enhance - Creating subclass for
"[class entity.Address, class entity.Geocode, class entity.BaseEntity]".
This means that your application will be less efficient and will consume
more memory than it would if you ran the OpenJPA enhancer. Additionally,
lazy loading will not be available for one-to-one and many-to-one persistent
attributes in types using field access; they will be loaded eagerly instead.
1703  CustomerTest  WARN   [main] openjpa.MetaData - No setter was found for
method longtitude in type entity.Geocode while searching for persistent
properties. This method will be ignored. If you intended for this to be
persistent, please add a corresponding setter, or switch to field access for
this type hierarchy.
1719  CustomerTest  WARN   [main] openjpa.MetaData - No setter was found for
method longtitude in type entity.Geocode while searching for persistent
properties. This method will be ignored. If you intended for this to be
persistent, please add a corresponding setter, or switch to field access for
this type hierarchy.
1766  CustomerTest  WARN   [main] openjpa.MetaData - No setter was found for
method longtitude in type entity.Geocode while searching for persistent
properties. This method will be ignored. If you intended for this to be
persistent, please add a corresponding setter, or switch to field access for
this type hierarchy.
1891  CustomerTest  TRACE  [main] openjpa.jdbc.SQL - <t 1090273532, conn
1509972480> executing prepstmnt 1293569306 SELECT SEQUENCE_VALUE FROM
OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE WITH RR [params=(int) 0]
1891  CustomerTest  TRACE  [main] openjpa.jdbc.SQL - <t 1090273532, conn
1509972480> [0 ms] spent
1891  CustomerTest  TRACE  [main] openjpa.jdbc.SQL - <t 1090273532, conn
1509972480> executing prepstmnt 559423832 UPDATE OPENJPA_SEQUENCE_TABLE SET
SEQUENCE_VALUE = ? WHERE ID = ? AND SEQUENCE_VALUE = ? [params=(long) 901,
(int) 0, (long) 851]
1906  CustomerTest  TRACE  [main] openjpa.jdbc.SQL - <t 1090273532, conn
1509972480> [15 ms] spent
2000  CustomerTest  TRACE  [main] openjpa.jdbc.SQL - <t 1090273532, conn
1181632110> executing prepstmnt 1721001620 INSERT INTO Address (id, city)
VALUES (?, ?) [params=(long) 851, (String) Chicago]
2000  CustomerTest  TRACE  [main] openjpa.jdbc.SQL - <t 1090273532, conn
1181632110> [0 ms] spent
Exception in thread "main" <openjpa-1.1.0-SNAPSHOT-r420667:616905 fatal
store error> org.apache.openjpa.persistence.RollbackException: The
transaction has been rolled back.  See the nested exceptions for details on
the errors that occurred.
        at
org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:494)
        at runtime.JpaTest.main(JpaTest.java:24)
Caused by: <openjpa-1.1.0-SNAPSHOT-r420667:616905 fatal general error>
org.apache.openjpa.persistence.PersistenceException: The transaction has
been rolled back.  See the nested exceptions for details on the errors that
occurred.
        at
org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2145)
        at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1992)
        at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1890)
        at
org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1808)
        at
org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
        at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1332)
        at
org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:861)
        at
org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:483)
        ... 1 more
Caused by: <openjpa-1.1.0-SNAPSHOT-r420667:616905 fatal user error>
org.apache.openjpa.persistence.InvalidStateException: Attempt to set column
"Address.id" to two different values: (class java.lang.Long)"851",
(null)"null" This can occur when you fail to set both sides of a two-sided
relation between objects, or when you map different fields to the same
column, but you do not keep the values of these fields in synch.
        at org.apache.openjpa.jdbc.sql.PrimaryRow.setObject(PrimaryRow.java:338)
        at org.apache.openjpa.jdbc.sql.RowImpl.setNull(RowImpl.java:456)
        at
org.apache.openjpa.jdbc.meta.strats.EmbedFieldStrategy$EmbeddedRow.setNull(EmbedFieldStrategy.java:1400)
        at
org.apache.openjpa.jdbc.meta.strats.HandlerStrategies.set(HandlerStrategies.java:136)
        at
org.apache.openjpa.jdbc.meta.strats.HandlerStrategies.set(HandlerStrategies.java:93)
        at
org.apache.openjpa.jdbc.meta.strats.HandlerFieldStrategy.insert(HandlerFieldStrategy.java:126)
        at 
org.apache.openjpa.jdbc.meta.FieldMapping.insert(FieldMapping.java:562)
        at
org.apache.openjpa.jdbc.meta.strats.EmbedFieldStrategy.insert(EmbedFieldStrategy.java:168)
        at
org.apache.openjpa.jdbc.meta.strats.EmbedFieldStrategy.insert(EmbedFieldStrategy.java:147)
        at 
org.apache.openjpa.jdbc.meta.FieldMapping.insert(FieldMapping.java:562)
        at
org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.insert(AbstractUpdateManager.java:203)
        at
org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.populateRowManager(AbstractUpdateManager.java:145)
        at
org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:85)
        at
org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:72)
        at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:549)
        at
org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130)
        ... 8 more

I've tested a few permutations and this is what I've found:

===

If I try to set geocode values for the Address object before persisting...

http://trac2.assembla.com/d5Z24gWSer3lvHabIlDkbG/browser/OpenJPA/EmbeddableTest/src/runtime/JpaTest.java?rev=29

... the address object still fails to persist.

===

If I remove the Address.geocode embedded object...

http://trac2.assembla.com/d5Z24gWSer3lvHabIlDkbG/browser/OpenJPA/EmbeddableTest/src/entity/Address.java?rev=31

... the address object persists successfully.

===

If I change the Address class so it does not extend BaseEntity (and instead
provides its own @Id property)...

http://trac2.assembla.com/d5Z24gWSer3lvHabIlDkbG/browser/OpenJPA/EmbeddableTest/src/entity/Address.java?rev=30

...the address object persists successfully

===

Thus, it seems to be an issue specifically related to the pattern of an
@Embeddable object inside an @Entity which extends a @MappedSuperclass.

I've tested this out on both openjpa-1.1.0-SNAPSHOT and openjpa-1.0.0.
-- 
View this message in context: 
http://www.nabble.com/Problem-with-MappedSuperclass-Entity-Embeddable-object-graph-tp15298457p15298457.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Reply via email to