[ 
https://issues.apache.org/jira/browse/OPENJPA-1677?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13487687#comment-13487687
 ] 

Caspar MacRae commented on OPENJPA-1677:
----------------------------------------


This is happening to me on a Temporal column that is autogenerated by the dB, 
which then triggers a toString() -> hashCode() -> id chain.


<openjpa-2.2.0-r422266:1244990 fatal user error> 
org.apache.openjpa.persistence.InvalidStateException: The field "xxx" of 
instance "why_are_you_calling_toString" contained a null value; the metadata 
for this field specifies that nulls are illegal.

The model works fine with other JPA providers, so I can only conclude that 
temporal definition is correct and I'm being hit by simultaneous OpenJpa bugs - 
the fact that this 2 years old, unassigned and not marked critical gives me 
cause for concern.
                
> "InvalidStateException: Detected reentrant flush..." while building an error 
> message for an earlier exception
> -------------------------------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-1677
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1677
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 2.0.0
>            Reporter: Vermeulen
>         Attachments: openjpa-1677_sscce.zip
>
>
> This error seems to only seems turn up when several criteria are met...
> I am calling entityManager.merge for a new entity that has a required 
> ManyToOne field set to null. This naturally gives an error like 
> "org.apache.openjpa.persistence.InvalidStateException: The field "test" of 
> instance "TestEntity " contained a null value; the metadata for this field 
> specifies that nulls are illegal."
> But under certain circumstances, while building the error message of this 
> error a new error occurs which masks the original error message. This message 
> is extremely confusing to me.
> When OpenJPA builds the error message for the original InvalidStateException 
> it seems to call the toString() method of my entity, which in it's turn gives 
> the "Detected reentrant flush" when:
>  1) inside the toString() method of my entity I acces the id field
>  2) the id field is annotated with @GeneratedValue(strategy = 
> GenerationType.IDENTITY)
> The stack trace I get is:
> Exception in thread "main" <openjpa-2.0.0-r422266:935683 fatal user error> 
> org.apache.openjpa.persistence.InvalidStateException: Detected reentrant 
> flush.  Make sure your flush-time instance callback methods or event 
> listeners do not invoke any operations that require the in-progress flush to 
> complete.
>       at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2033)
>       at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1808)
>       at 
> org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:609)
>       at 
> org.apache.openjpa.kernel.StateManagerImpl.assignField(StateManagerImpl.java:696)
>       at 
> org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1608)
>       at 
> org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1591)
>       at entities.TestEntity.pcGetid(TestEntity.java)
>       at entities.TestEntity.toString(TestEntity.java:34)
>       at java.text.MessageFormat.subformat(MessageFormat.java:1246)
>       at java.text.MessageFormat.format(MessageFormat.java:836)
>       at java.text.Format.format(Format.java:140)
>       at java.text.MessageFormat.format(MessageFormat.java:812)
>       at 
> org.apache.openjpa.lib.util.Localizer$Message.getMessage(Localizer.java:277)
>       at 
> org.apache.openjpa.util.OpenJPAException.<init>(OpenJPAException.java:64)
>       at org.apache.openjpa.util.UserException.<init>(UserException.java:47)
>       at 
> org.apache.openjpa.util.InvalidStateException.<init>(InvalidStateException.java:34)
>       at 
> org.apache.openjpa.kernel.SingleFieldManager.preFlush(SingleFieldManager.java:553)
>       at 
> org.apache.openjpa.kernel.SingleFieldManager.preFlush(SingleFieldManager.java:491)
>       at 
> org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2957)
>       at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:40)
>       at 
> org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1047)
>       at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2077)
>       at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2037)
>       at 
> org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1955)
>       at 
> org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
>       at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1479)
>       at 
> org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:925)
>       at 
> org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:559)
>       at MinimalExample.saveInTransaction(MinimalExample.java:41)
>       at MinimalExample.failingExample(MinimalExample.java:29)
>       at MinimalExample.main(MinimalExample.java:15)
> Why is OpenJPA calling the toString() method anyway, this seems to be 
> dangerous...
> This second error goes away and I get the original error when I either remove 
> the access tot the id field inside my toString() method or when I simply use 
> @GeneratedValue with the default strategy.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to