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

Helen Xu commented on OPENJPA-2072:
-----------------------------------

Before it set the time stamp value to the delete prepared statement, it will 
set the nanosecond of the time stamp based on the precision.  This setting 
triggered the dirty update on PDeletedState and caused the invalid state error 
being generated.

here is the code path

        PDeletedState.beforeOptimisticWrite(StateManagerImpl, int, boolean) 
line: 76    
        StateManagerImpl.dirty(int, Boolean, boolean) line: 1546        
        StateManagerImpl.dirty(int) line: 1485  
        Proxies.dirty(Proxy, boolean) line: 66  
        java$sql$Timestamp$proxy.setNanos(int) line: not available      
        DB2Dictionary(DBDictionary).setTimestamp(PreparedStatement, int, 
Timestamp, Calendar, Column) line: 1103        
        DB2Dictionary(DBDictionary).setTyped(PreparedStatement, int, Object, 
Column, int, JDBCStore) line: 1241 
        PrimaryRow(RowImpl).flush(PreparedStatement, int, DBDictionary, 
JDBCStore) line: 888    
        PrimaryRow(RowImpl).flush(PreparedStatement, DBDictionary, JDBCStore) 
line: 848 
        PreparedStatementManagerImpl.flushInternal(RowImpl) line: 95    
        PreparedStatementManagerImpl.flush(RowImpl) line: 73    
        ConstraintUpdateManager.flush(Collection, PreparedStatementManager) 
line: 543   
        ConstraintUpdateManager.flush(RowManager, PreparedStatementManager, 
Collection) line: 119       
        ConstraintUpdateManager(AbstractUpdateManager).flush(Collection, 
JDBCStore, PreparedStatementManager) line: 89  
        ConstraintUpdateManager(AbstractUpdateManager).flush(Collection, 
JDBCStore) line: 72    
        JDBCStoreManager.flush(Collection) line: 514    
        ROPStoreManager(DelegatingStoreManager).flush(Collection) line: 130     
        FinalizingBrokerImpl(BrokerImpl).flush(int) line: 1956  
        FinalizingBrokerImpl(BrokerImpl).flushSafe(int) line: 1854      
        FinalizingBrokerImpl(BrokerImpl).beforeCompletion() line: 1772  
        LocalManagedRuntime.commit() line: 81   
        FinalizingBrokerImpl(BrokerImpl).commit() line: 1294    
        DelegatingBroker.commit() line: 861     
        EntityManagerImpl.commit() line: 408

Fix and test case attached.
                
> InvalidStateException deleting an instance with a timestamp in its primary key
> ------------------------------------------------------------------------------
>
>                 Key: OPENJPA-2072
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-2072
>             Project: OpenJPA
>          Issue Type: Bug
>    Affects Versions: 1.2.1, 1.2.2, 1.2.3
>         Environment: Linux, JUnit + Spring and HSQLDB in a case; Windows, 
> WebSphere and DB2 in another case
>            Reporter: Ernesto Ricci
>            Assignee: Helen Xu
>         Attachments: OPENJPA-2072Patch
>
>
> Attempting to remove an instance that has a timestamp field in its primary 
> key results in this error:
> org.apache.openjpa.persistence.InvalidStateException: Operation attempted on 
> a deleted instance.
> Suppose I have this table:
> CREATE TABLE test_tsp (
>    t Timestamp,
>    desc char(30)
> )
> containing just the following row:
> INSERT INTO test_tsp(T,DESC) VALUES ( CURRENT_TIMESTAMP, 'one')
> the table is mapped to this JPA Entity
> @Entity
> @Table(name="TEST_TSP")
> public class TestTsp implements Serializable {
>  private static final long serialVersionUID = -5756434331459759089L;
>  @Column(name="T")
>  @Id
>  private Timestamp idTsp;
>  @Column(name="DESC")
>  private String desc;
>  public TestTsp() {
>   super();
>  }
> ...getters and setters here...
> }
> and the following code attempts a delete of the row I've inserted
>  Query query = em.createQuery("select t from TestTsp t where t.desc='one'");
>  List<TestTsp> list = query.getResultList();
>  for (TestTsp t : list) {
>   em.remove(t);
>  }
> Here is the error I get:
> ...
> Caused by: <openjpa-1.2.2-r422266:898935 nonfatal user error> 
> org.apache.openjpa.persistence.InvalidStateException: Operation attempted on 
> a deleted instance.
> FailedObject: org.apache.openjpa.enhance.provatsp$TestTsp$pcsubclass@3c0b655a
>         at org.apache.openjpa.kernel.PCState.error(PCState.java:443)
>         at 
> org.apache.openjpa.kernel.PDeletedState.beforeOptimisticWrite(PDeletedState.java:76)
>         at 
> org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1575)
>         at 
> org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1515)
>         at org.apache.openjpa.util.Proxies.dirty(Proxies.java:66)
>         at org.apache.openjpa.util.java$sql$Timestamp$proxy.setNanos(Unknown 
> Source)
>         at 
> org.apache.openjpa.jdbc.sql.DBDictionary.setTimestamp(DBDictionary.java:1144)
>         at 
> org.apache.openjpa.jdbc.sql.DBDictionary.setTyped(DBDictionary.java:1282)
>         at org.apache.openjpa.jdbc.sql.RowImpl.flush(RowImpl.java:890)
>         at org.apache.openjpa.jdbc.sql.RowImpl.flush(RowImpl.java:850)
>         at 
> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:118)
>         at 
> org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushAndUpdate(BatchingPreparedStatementManagerImpl.java:82)
>         at 
> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:89)
>         at 
> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:72)
>         at 
> org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:543)
>         at 
> org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:119)
>         at 
> org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:59)
>         at 
> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:89)
>         at 
> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:72)
>         at 
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:721)
>         at 
> org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130)
>         ... 40 more
> N.B.: the error doesn't happen if the primary key annotation (@Id) is moved 
> on the other field of the entity, which is not a timestamp but a char:
>  @Column(name="T")
>  private Timestamp idTsp;
>  @Column(name="DESC")
>  @Id
>  private String desc;

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to