[
https://issues.jboss.org/browse/WFLY-12674?page=com.atlassian.jira.plugin...
]
Scott Marlow updated WFLY-12674:
--------------------------------
Description:
[From related JPA expert group
discussion|https://download.oracle.com/javaee-archive/jpa-spec.java.net/u...]:
{code}
>>>> Perhaps a clearer proposal could be:
>>>>
>>>> "
>>>> If the entity manager is invoked outside the scope of a transaction,
>>>> any entities loaded from the database will
>>>> immediately become detached at the end of the container level method
>>>> invocation call (e.g. when the session bean method
>>>> ends).
>>>> "
>>>
>>> Ah, thanks. That is not the intended semantics. Rather it is that the
>>> persistence context is created to service the method call that is made
>>> on the entity manager only. It doesn't have the duration of a business
>>> method invocation.
>>
>> Is it really?
>>
>
> Yes. See also section 3.8.7, which is quite explicit with regard to
> queries.
> BTW, these decisions date back to JPA 1.0 (aka EJB 3.0).
My updated proposal for the 7.6.2 wording is:
"
If the entity manager is invoked outside the scope of a transaction, any entities loaded
from the database will
immediately become detached at the end of the entity manager method call.
"
OK, sure + "... or query invocation"
{code}
Note that we missed Linda's response of "... or query invocation" in the JPA
spec update, as the JPA 2.2 spec today states:
{quote}
7.6.2 Container-managed Transaction-scoped Persistence Context
The application can obtain a container-managed entity manager with transaction-scoped
persistence context by injection or direct lookup in the JNDI namespace. The persistence
context type for the entity manager is defaulted or defined as
PersistenceContextType.TRANSACTION.
A new persistence context begins when the container-managed entity manager is invoked [84]
in the scope of an active JTA transaction, and there is no current persistence context
already associated with the JTA transaction. The persistence context is created and then
associated with the JTA transaction. This association of the persistence context with the
JTA transaction is independent of the synchronization type of the persistence context and
whether the persistence context has been joined to the transaction.
{quote}
[Some related AS5/6 JPA container
code.|https://anonsvn.jboss.org/repos/jbossas/projects/jpa/trunk/impl/src...]
which simply cleared the persistence context as we were creating a new Query, for example
see:
{code}
public Query createQuery(String ejbqlString)
{
EntityManager em = getEntityManager();
detachEntitiesIfNoTx(em);
return em.createQuery(ejbqlString);
}
{code}
Also of reference, is from issue description [WFLY-3674]:
{quote}
For compatibility with earlier JBoss application server versions (5.0/6.0), add an
extension that allows the persistence context to last until the referencing persistence
context is closed.
For example, in a session method that has no active JTA transaction, entities returned,
will not cleared from the persistence context, until the session method completes. This
extension is only introduced to allow compatibility with older application server
versions.
{quote}
was:
[From related JPA expert group
discussion|https://download.oracle.com/javaee-archive/jpa-spec.java.net/u...]:
{code}
>>>> Perhaps a clearer proposal could be:
>>>>
>>>> "
>>>> If the entity manager is invoked outside the scope of a transaction,
>>>> any entities loaded from the database will
>>>> immediately become detached at the end of the container level method
>>>> invocation call (e.g. when the session bean method
>>>> ends).
>>>> "
>>>
>>> Ah, thanks. That is not the intended semantics. Rather it is that the
>>> persistence context is created to service the method call that is made
>>> on the entity manager only. It doesn't have the duration of a business
>>> method invocation.
>>
>> Is it really?
>>
>
> Yes. See also section 3.8.7, which is quite explicit with regard to
> queries.
> BTW, these decisions date back to JPA 1.0 (aka EJB 3.0).
My updated proposal for the 7.6.2 wording is:
"
If the entity manager is invoked outside the scope of a transaction, any entities loaded
from the database will
immediately become detached at the end of the entity manager method call.
"
OK, sure + "... or query invocation"
{code}
Note that we missed Linda's response of "... or query invocation" in the JPA
spec update, as the JPA 2.2 spec today states:
{quote}
7.6.2 Container-managed Transaction-scoped Persistence Context
The application can obtain a container-managed entity manager with transaction-scoped
persistence context by injection or direct lookup in the JNDI namespace. The persistence
context type for the entity manager is defaulted or defined as
PersistenceContextType.TRANSACTION.
A new persistence context begins when the container-managed entity manager is invoked [84]
in the scope of an active JTA transaction, and there is no current persistence context
already associated with the JTA transaction. The persistence context is created and then
associated with the JTA transaction. This association of the persistence context with the
JTA transaction is independent of the synchronization type of the persistence context and
whether the persistence context has been joined to the transaction.
{quote}
[Some related AS5/6 JPA container
code.|https://anonsvn.jboss.org/repos/jbossas/projects/jpa/trunk/impl/src...]
which simply cleared the persistence context as we were creating a new Query, for example
see:
{code}
public Query createQuery(String ejbqlString)
{
EntityManager em = getEntityManager();
detachEntitiesIfNoTx(em);
return em.createQuery(ejbqlString);
}
{code}
placeholder for deferDetach issue
---------------------------------
Key: WFLY-12674
URL:
https://issues.jboss.org/browse/WFLY-12674
Project: WildFly
Issue Type: Task
Components: JPA / Hibernate
Reporter: Scott Marlow
Assignee: Scott Marlow
Priority: Major
[From related JPA expert group
discussion|https://download.oracle.com/javaee-archive/jpa-spec.java.net/u...]:
{code}
>>>>> Perhaps a clearer proposal could be:
>>>>>
>>>>> "
>>>>> If the entity manager is invoked outside the scope of a
transaction,
>>>>> any entities loaded from the database will
>>>>> immediately become detached at the end of the container level
method
>>>>> invocation call (e.g. when the session bean method
>>>>> ends).
>>>>> "
>>>>
>>>> Ah, thanks. That is not the intended semantics. Rather it is that the
>>>> persistence context is created to service the method call that is made
>>>> on the entity manager only. It doesn't have the duration of a
business
>>>> method invocation.
>>>
>>> Is it really?
>>>
>>
>> Yes. See also section 3.8.7, which is quite explicit with regard to
>> queries.
>> BTW, these decisions date back to JPA 1.0 (aka EJB 3.0).
>
> My updated proposal for the 7.6.2 wording is:
>
> "
> If the entity manager is invoked outside the scope of a transaction, any entities
loaded from the database will
> immediately become detached at the end of the entity manager method call.
> "
OK, sure + "... or query invocation"
{code}
Note that we missed Linda's response of "... or query invocation" in the
JPA spec update, as the JPA 2.2 spec today states:
{quote}
7.6.2 Container-managed Transaction-scoped Persistence Context
The application can obtain a container-managed entity manager with transaction-scoped
persistence context by injection or direct lookup in the JNDI namespace. The persistence
context type for the entity manager is defaulted or defined as
PersistenceContextType.TRANSACTION.
A new persistence context begins when the container-managed entity manager is invoked
[84] in the scope of an active JTA transaction, and there is no current persistence
context already associated with the JTA transaction. The persistence context is created
and then associated with the JTA transaction. This association of the persistence context
with the JTA transaction is independent of the synchronization type of the persistence
context and whether the persistence context has been joined to the transaction.
{quote}
[Some related AS5/6 JPA container
code.|https://anonsvn.jboss.org/repos/jbossas/projects/jpa/trunk/impl/src...]
which simply cleared the persistence context as we were creating a new Query, for example
see:
{code}
public Query createQuery(String ejbqlString)
{
EntityManager em = getEntityManager();
detachEntitiesIfNoTx(em);
return em.createQuery(ejbqlString);
}
{code}
Also of reference, is from issue description [WFLY-3674]:
{quote}
For compatibility with earlier JBoss application server versions (5.0/6.0), add an
extension that allows the persistence context to last until the referencing persistence
context is closed.
For example, in a session method that has no active JTA transaction, entities returned,
will not cleared from the persistence context, until the session method completes. This
extension is only introduced to allow compatibility with older application server
versions.
{quote}
--
This message was sent by Atlassian Jira
(v7.13.8#713008)