Return-Path: X-Original-To: apmail-openjpa-dev-archive@www.apache.org Delivered-To: apmail-openjpa-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id E3F98103C9 for ; Mon, 19 Aug 2013 18:07:48 +0000 (UTC) Received: (qmail 91056 invoked by uid 500); 19 Aug 2013 18:07:48 -0000 Delivered-To: apmail-openjpa-dev-archive@openjpa.apache.org Received: (qmail 91020 invoked by uid 500); 19 Aug 2013 18:07:48 -0000 Mailing-List: contact dev-help@openjpa.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openjpa.apache.org Delivered-To: mailing list dev@openjpa.apache.org Received: (qmail 90986 invoked by uid 99); 19 Aug 2013 18:07:48 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 19 Aug 2013 18:07:48 +0000 Date: Mon, 19 Aug 2013 18:07:47 +0000 (UTC) From: "Piotr Klimczak (JIRA)" To: dev@openjpa.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Updated] (OPENJPA-2422) ClassMapping and it's strategy will never get initialized due to some synchronizatin/wrong initializaion order problems MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ https://issues.apache.org/jira/browse/OPENJPA-2422?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Piotr Klimczak updated OPENJPA-2422: ------------------------------------ Summary: ClassMapping and it's strategy will never get initialized due to some synchronizatin/wrong initializaion order problems (was: ClassMapping and it's strategy will never get initialized due to some synchronizatin problems) > ClassMapping and it's strategy will never get initialized due to some synchronizatin/wrong initializaion order problems > ----------------------------------------------------------------------------------------------------------------------- > > Key: OPENJPA-2422 > URL: https://issues.apache.org/jira/browse/OPENJPA-2422 > Project: OpenJPA > Issue Type: Bug > Components: jpa, kernel > Affects Versions: 2.2.2 > Environment: Apache ServiceMix 4.5.2 > Reporter: Piotr Klimczak > Priority: Blocker > Labels: ClassCastException, ManyToOne, OneToMany, synchronization > Attachments: OPENJPA-2422.ResolveClassMetaData.trace, OPENJPA-2422.ResolveMetaDataRepository.trace > > > After I have switched my software to ServiceMix 4.5.2 I have faced very strange blocking issue. > I have bidirection relation: OneToMany and ManyToOne that was working fine before switching to ServiceMix 4.5.2. > After switching to ServiceMix 4.5.2 i am getting this Exception: > {code} > Caused by: java.lang.ClassCastException: org.apache.openjpa.util.LongId cannot be cast to XXXXXXXXXXXXXXX.PARENT > at XXXXXXXXXXXXXXX.CHILD.pcReplaceField(CHILD.java)[227:XXXXXXXXXXXXXXX:4.0.1.SNAPSHOT] > at org.apache.openjpa.kernel.StateManagerImpl.replaceField(StateManagerImpl.java:3213) > at org.apache.openjpa.kernel.StateManagerImpl.storeObjectField(StateManagerImpl.java:2643) > at org.apache.openjpa.kernel.StateManagerImpl.storeObject(StateManagerImpl.java:2633) > at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.setMappedBy(JDBCStoreManager.java:478) > at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initializeState(JDBCStoreManager.java:404) > at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initialize(JDBCStoreManager.java:306) > at org.apache.openjpa.kernel.DelegatingStoreManager.initialize(DelegatingStoreManager.java:112) > at org.apache.openjpa.kernel.ROPStoreManager.initialize(ROPStoreManager.java:57) > at org.apache.openjpa.kernel.BrokerImpl.initialize(BrokerImpl.java:1046) > at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:1004) > ... 133 more > {code} > As I have done some debugging, it looks like as some synchronization problems in OpenJPA. > I'm getting this exception, because ClassMappings are constructed and putted into MODE_META state, before MetaDataRepository that owns them reaches MODE_MAPPING_INIT. So then when MetaDataRepository reaches MODE_MAPPING_INIT state, all ClassMappings are already in MODE_META state and will never be putted into MODE_MAPPING_INIT state as implemented in resolve method in MetaDataRepository: > {code} > /** > * Resolve the given metadata if needed. There are three goals: > *
    > *
  1. Make sure no unresolved metadata gets back to the client.
  2. > *
  3. Avoid infinite reentrant calls for mutually-dependent metadatas by allowing unresolved > * metadata to be returned to other metadatas.
  4. > *
  5. Always make sure the superclass metadata is resolved before the subclass metadata so that > * the subclass can access the super's list of fields.
  6. > *
> * Note that the code calling this method is synchronized, so this method doesn't have to be. > */ > private void resolve(ClassMetaData meta) { > // return anything that has its metadata resolved, because that means > // it is either fully resolved or must at least be in the process of > // resolving mapping, etc since we do that right after meta resolve > if (meta == null || _resMode == MODE_NONE || (meta.getResolve() & MODE_META) != 0) > return; > {code} > So it makes ClassMapping's strategy impossible to initialize, once it reaches MODE_META state. > Due to above problem for example the RelationFieldStrategy will never get initialized, so then the FieldMetadata has _intermediate filed set to false which causes OpenJPA to set a LongId value to the field of type PARENT. > In my case, this is a blocker. > Unfortunately i am not able to write a testcase for this bug due to both: do not have a time for this and scenerio is way too complex- multithreaded app. > In my case problem occurs in aprox 95% app starts. -- 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