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

chenlin commented on OPENJPA-2452:
----------------------------------

Hi,Tobias Meyer 
This issue was discussed at the Community Forum, which is available at: 
http://openjpa.208410.n2.nabble.com/Identity-Problem-with-MappedSuperclass-td208511.html

> Unexpected ArgumentException in flush if cascaded persist failed
> ----------------------------------------------------------------
>
>                 Key: OPENJPA-2452
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-2452
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 2.2.1, 2.2.2
>         Environment: Java 7
>            Reporter: Tobias Meyer
>            Priority: Minor
>
> I have two entities like these:
> {code}
> public class A {
>     @Id
>     @GeneratedValue(strategy = GenerationType.IDENTITY)
>     private long oid;
>       
>     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
>     @JoinColumn(name = "A_OID", referencedColumnName = "OID", nullable = 
> false)
>     @OrderColumn(name = "POSITION")
>     private List < B > bs;
> }
> public class B {
>     @Id
>     @GeneratedValue(strategy = GenerationType.IDENTITY)
>     private long oid;
>       
>     // value column is not null in database
>     private String value;
> }
> {code}
> The application code looks like this:
> {code}
> EntityManager em;
> A a = new A();
> B b1 = new B();
> B b2 = new B();
> b1.setValue("b1");
> //b2's value is null
> List<B> bs = new ArrayList<B>();
> bs.add(b1);
> bs.add(b2);
> a.setBs(bs);
> em.persist(a);
> em.flush(); //throws org.apache.openjpa.persistence.PersistenceException 
> because b2's value is null
> {code}
> The code throws a PersistenceException which is expected since the not null 
> constraint in the database for B's value is violated, but what I wouldn't 
> expect is that the stacktrace contains a nested Exception like this:
> {code}
> NestedThrowables:
> <openjpa-2.2.2-r422266:1468616 nonfatal user error> 
> org.apache.openjpa.persistence.ArgumentException: Attempt to assign id "0" to 
> new instance "com.capgemini.tmeyer.B@14a0414" failed; there is already an 
> object in the L1 cache with this id. You must delete this object (in a 
> previous transaction or the current one) before reusing its id.  This error 
> can also occur when a horizontally or vertically mapped classes uses 
> auto-increment application identity and does not use a hierarchy of 
> application identity classes.
> FailedObject: com.capgemini.tmeyer.B@14a0414
>       at 
> org.apache.openjpa.kernel.ManagedCache.assignObjectId(ManagedCache.java:190)
>       at 
> org.apache.openjpa.kernel.BrokerImpl.assignObjectId(BrokerImpl.java:5079)
>       at 
> org.apache.openjpa.kernel.BrokerImpl.setStateManager(BrokerImpl.java:4137)
>       at 
> org.apache.openjpa.kernel.StateManagerImpl.assertObjectIdAssigned(StateManagerImpl.java:623)
>       at 
> org.apache.openjpa.kernel.StateManagerImpl.afterFlush(StateManagerImpl.java:1074)
>       at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2207)
>       at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2082)
>       at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1853)
>       at 
> org.apache.openjpa.kernel.DelegatingBroker.flush(DelegatingBroker.java:1045)
>       at 
> org.apache.openjpa.persistence.EntityManagerImpl.flush(EntityManagerImpl.java:663)
>       at com.capgemini.tmeyer.BugTest.main(BugTest.java:29)
> {code}
> This nested Exception only occurs when flush is explicitly called, without it 
> there's only the PersistenceException when the (surrounding) transaction is 
> committed.
> For me it looks like the afterFlush method doesn't correctly handle the 
> situation when a cascaded persist failed during an explicit flush and 
> therefore the id generated by IDENTITY couldn't be set.
> I didn't observe any erroneous impact beside the fact that the nested 
> exception is quite confusing and misleading, but perhabs someone should make 
> sure there really isn't more to it.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to