[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [eclipselink-users] Issues with remove jta, eclipselink with a relational object..
|
Thanx Christopher,
> Spring wraps the EclipseLink EntityManager in its own, so it is still quite
> possible you are not using the same underlying EntityManager on the
> find/merge and remove calls - actually this is the only way it can happen.
>
> Check your transaction demarcation to be sure the two calls are occurring in
> the same transaction, otherwise Spring might give you different EMs on each
> call.
>
If you look at my deleteObject I am doing a find before doing a remove
,So shouldn't either find/merge get the entity to be managed. I
rewrote the deleteObject slightly to be as follows , but am still
having the error..
Also , given that this is called with the ejb method and we are
starting a transaction at the boundary of the method call , the
deleteObject should definitely be within the same transaction. I used
the link that you sent and even set the two ends of my object to be
null but that is not helping either..
public <T extends PersistableObject> void deleteObject(T entity)
throws DAOException
{
try
{
EntityManager em=getEntityManager();
if (em.contains(entity)) {
em.remove(entity);
} else {
entity = (T) em.find(entity.getClass(), entity.getId());
if (em.contains(entity))
{
System.out.println("hello");
}
em.remove(em.merge(entity));
}
}
catch (PersistenceException e)
{
e.printStackTrace() ;
throw new DAOException(e.getMessage()) ;
}
}
Given that i am using the same em across both the merges and deletes ,
i am still not sure why i don't either get an exception or it doesn't
delete still.
Cheers
Vaidya
On Wed, Jul 11, 2012 at 11:17 AM, Christopher Delahunt
<christopher.delahunt@xxxxxxxxxx> wrote:
> Spring wraps the EclipseLink EntityManager in its own, so it is still quite
> possible you are not using the same underlying EntityManager on the
> find/merge and remove calls - actually this is the only way it can happen.
>
> Check your transaction demarcation to be sure the two calls are occurring in
> the same transaction, otherwise Spring might give you different EMs on each
> call.
>
> A similar problem is described here:
> http://stackoverflow.com/questions/2428706/jpa-thinks-im-deleting-a-detached-object
>
> Best Regards,
> Chris
>
>
> On 11/07/2012 12:10 PM, vaidya nathan wrote:
>>
>> The entityManager is just injected ..
>>
>> public BaseEclipselinkDAO
>> {
>> protected EntityManager getEntityManager() throws DAOException
>> {
>> return entityManager;
>> }
>> @PersistenceContext(unitName="PersistenceEl")
>> private EntityManager entityManager = null ;
>> }
>>
>>
>> and we use spring to inject the entity manager
>>
>> <bean id="entityManagerFactory"
>>
>> class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
>> <property name="dataSource" ref="ourDataSource" />
>> <property name="persistenceUnitName" value="PersistenceEl"
>> />
>> <property name="jpaDialect" ref="eclipseLinkDialect" />
>> <property name="persistenceXmlLocation"
>> value="classpath:META-INF/persistence-eclipse.xml"
>> />
>> <property name="jpaVendorAdapter">
>> <bean
>>
>> class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
>> <property name="showSql" value="true" />
>> <property name="generateDdl" value="false"
>> />
>> </bean>
>> </property>
>>
>> <property name="jpaPropertyMap">
>> <map>
>> <entry key="eclipselink.target-server" value="JBOSS"/>
>> <entry key="eclipselink.target-database"
>> value="Oracle"/>
>> <entry
>> key="eclipselink.persistence-context.flush-mode" value="AUTO"/>
>> <entry key="eclipselink.jdbc.native-sql" value="false" />
>> <entry key="eclipselink.weaving" value="false" />
>> <entry key="eclipselink.logging.logger"
>> value="org.eclipse.persistence.logging.DefaultSessionLog" />
>> <entry key="eclipselink.logging.level" value="FINEST" />
>> <entry key="eclipselink.logging.parameters" value="true"/>
>> <entry key="eclipselink.logging.exceptions" value="true"
>> />
>> <entry key="eclipselink.orm.throw.exceptions" value="true"
>> />
>> <entry key="eclipselink.session.customizer"
>> value="com.dst.hps.persistence.dao.eclipselink.SessionCustomizers" />
>> </map>
>> </property>
>> </bean>
>>
>> <bean id="eclipseLinkDialect"
>> class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect" />
>>
>>
>> <tx:jta-transaction-manager />
>>
>>
>>> Your first example did not use deleteObject method at all but I see it in
>>> exception stack so this was just your simplification of real code, am I
>>> right?
>>>
>>
>> Yes - this is just a simplification of the real code. I did get some
>> ideas from other folks who are having similar issues and i just
>> simplified the code .
>>
>> Cheers
>> Vaidya
>>
>>
>>
>> On Wed, Jul 11, 2012 at 10:22 AM, Rodion Gushchin<graymagi@xxxxxxxxx>
>> wrote:
>>>
>>> Is there a possibility that getEntityManager() return different entity
>>> manager instance every call or e.g. only inside getObjects or
>>> deleteObject
>>> or somehow implicitly starts new transaction or nested transaction? Can
>>> you
>>> trace that? May be you can also show source code for getEntityManager()
>>> method.
>>> Your first example did not use deleteObject method at all but I see it in
>>> exception stack so this was just your simplification of real code, am I
>>> right?
>>>
>>>
>>> On Wed, Jul 11, 2012 at 4:58 PM, vaidya nathan<vaidyaatdst@xxxxxxxxx>
>>> wrote:
>>>>
>>>>
>>>> Thx for the reply.. Following is the info. that you requested..
>>>>
>>>>> 1) What getObjects(UserRole.class, exp) doing? Can you provide source
>>>>> code
>>>>> for this call?
>>>>
>>>>
>>>> getObjects(UserRole.class,exp) is as follows
>>>> {
>>>> ReadAllQuery query = (exp == null ? new ReadAllQuery(clazz) : new
>>>> ReadAllQuery(clazz, exp));
>>>> query.setShouldFilterDuplicates(true) ;
>>>> Query jpaq = JpaHelper.createQuery(query, getEntityManager()) ;
>>>> List<T> result = jpaq.getResultList() ;
>>>> return result;
>>>> }
>>>>
>>>>
>>>>> 2) Why are you doing getEntityManager().merge(urole)? Why not use
>>>>> entityManager variable and why you are merging entity before removing
>>>>> it
>>>>> do
>>>>> you expect it to be detached?
>>>>
>>>>
>>>>
>>>> We could use the entityManager variable itself .. There is no reason
>>>> to do a getEntityManager() again .
>>>> We tried to do a merge of the entity because
>>>> 1. From various posts that was the way in which we can reattach the
>>>> entity
>>>> back
>>>> 2. Thats what the error asked us to do.
>>>>
>>>> Also i modified the deleteObject as follows :
>>>>
>>>> public<T extends PersistableObject> void deleteObject(T entity)
>>>> throws DAOException
>>>> {
>>>> try
>>>> {
>>>> if (getEntityManager().contains(entity)) {
>>>> System.out.println("Succeeding contains");
>>>> getEntityManager().remove(entity);
>>>> } else {
>>>> entity = (T)
>>>> getEntityManager().find(entity.getClass(), entity.getId());
>>>> if (getEntityManager().contains(entity))
>>>> {
>>>> System.out.println("Succeeding contains");
>>>> }
>>>> getEntityManager().remove(entity);
>>>> }
>>>>
>>>> }
>>>> catch (PersistenceException e)
>>>> {
>>>> e.printStackTrace() ;
>>>> throw new DAOException(e.getMessage()) ;
>>>> }
>>>> }
>>>>
>>>> it never prints "Succeeding contains" - So we are not able to
>>>> remove the entity because the entity is never getting managed/attached
>>>> to UOW .
>>>>
>>>> Cheers
>>>> Vaidya
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Wed, Jul 11, 2012 at 8:08 AM, Rodion Gushchin<graymagi@xxxxxxxxx>
>>>> wrote:
>>>>>
>>>>> Two questions:
>>>>>
>>>>> 1) What getObjects(UserRole.class, exp) doing? Can you provide source
>>>>> code
>>>>> for this call?
>>>>> 2) Why are you doing getEntityManager().merge(urole)? Why not use
>>>>> entityManager variable and why you are merging entity before removing
>>>>> it
>>>>> do
>>>>> you expect it to be detached?
>>>>>
>>>>> Rodion
>>>>>
>>>>> On Wed, Jul 11, 2012 at 2:50 PM, vaidya nathan<vaidyaatdst@xxxxxxxxx>
>>>>> wrote:
>>>>>>
>>>>>>
>>>>>> Sorry to repost but anyone having a solution for this problem .. ? I
>>>>>> am totally struck ..
>>>>>>
>>>>>> On Tue, Jul 10, 2012 at 1:05 PM, vaidya nathan<vaidyaatdst@xxxxxxxxx>
>>>>>> wrote:
>>>>>>>
>>>>>>> Greetings,
>>>>>>>
>>>>>>> I am having issues with delete on a table which connects two entities
>>>>>>> but otherwise is independant(No cascade,etc). I keep getting
>>>>>>> Caused by: java.lang.IllegalArgumentException: Entity must be managed
>>>>>>> to call remove: UserRole@595, try merging the detached and try the
>>>>>>> remove again.
>>>>>>>
>>>>>>> Following is my model.I have a class UserRole which is defined as
>>>>>>> follows
>>>>>>>
>>>>>>> @Entity
>>>>>>> @Table(name="USER_ROLE",
>>>>>>> uniqueConstraints={@UniqueConstraint(columnNames={"USER_ID",
>>>>>>> "ROLE_ID"})})
>>>>>>> public class UserRole extends PersistableObject implements
>>>>>>> Effectivity<EffectivePeriodWithEnable>
>>>>>>> {
>>>>>>> @OneToOne(fetch=FetchType.EAGER)
>>>>>>> @JoinColumn(name="USER_ID", nullable=false)
>>>>>>> private User user ;
>>>>>>> @OneToOne(fetch=FetchType.EAGER)
>>>>>>> @JoinColumn(name="ROLE_ID", nullable=false)
>>>>>>> private Role role ;
>>>>>>> @Column(name="DEFAULT_ROLE", nullable=false)
>>>>>>> private Boolean defaultRole ;
>>>>>>> @Embedded
>>>>>>> private EffectivePeriodWithEnable span ;
>>>>>>> }
>>>>>>> which basically is a relation between User and Role with some
>>>>>>> attributes defined in the relation like the defaultRole and a span
>>>>>>> when the relation would be active/inactive.
>>>>>>>
>>>>>>>
>>>>>>> User is like this
>>>>>>> public class User extends PersistableObject
>>>>>>> {
>>>>>>> @Column(name="LOGIN", nullable=false, unique=true,
>>>>>>> length=20)
>>>>>>> private String loginName;
>>>>>>> @Column(name="FIRST_NM", nullable=false, length=35)
>>>>>>> private String firstName;
>>>>>>> @Column(name="MID_NM", nullable=true, length=25)
>>>>>>> private String middleName;
>>>>>>> ...etc...etc(Not relevant to this discussion)
>>>>>>> }
>>>>>>>
>>>>>>> @Entity
>>>>>>> @Table(name="ROLE")
>>>>>>> public class Role extends PersistableObject
>>>>>>> {
>>>>>>> @Column(name="NAME", nullable=false, unique=true, length=50)
>>>>>>> private String name;
>>>>>>>
>>>>>>> @Column(name="DESCRIPTION", nullable=true, length=255)
>>>>>>> private String description;
>>>>>>> ....etc...etc(Not relevant to this discussion)
>>>>>>> }
>>>>>>>
>>>>>>> I have a method defined in the DAO something like this
>>>>>>>
>>>>>>> public void setRoles(User user, List<Role> roles,
>>>>>>> EffectivePeriodWithEnable p) throws DAOException
>>>>>>> {
>>>>>>> try
>>>>>>> {
>>>>>>> ExpressionBuilder eb = new
>>>>>>> ExpressionBuilder(UserRole.class)
>>>>>>> ;
>>>>>>> Expression exp = eb.get("user").equal(user) ;
>>>>>>> List<UserRole> uroles = (List<UserRole>)
>>>>>>> getObjects(UserRole.class, exp);
>>>>>>> EntityManager entityManager = getEntityManager() ;
>>>>>>>
>>>>>>> if (uroles != null)
>>>>>>> {
>>>>>>> for (UserRole urole: uroles)
>>>>>>> {
>>>>>>> // I have tried this with and without merge . I
>>>>>>> dont think that i should do a merge since the getobjects (which
>>>>>>> internally uses ReadAllQuery to fetch
>>>>>>> // the object is just got here in this method..
>>>>>>>
>>>>>>> getEntityManager().remove(getEntityManager().merge(urole));
>>>>>>> }
>>>>>>> }
>>>>>>> }
>>>>>>> }
>>>>>>>
>>>>>>> I am running in a jta container and these methods are called within
>>>>>>> an
>>>>>>> ejb method call . When it runs and tries to remove , following is
>>>>>>> what
>>>>>>> i get
>>>>>>>
>>>>>>>
>>>>>>> Caused by: java.lang.IllegalArgumentException: Entity must be managed
>>>>>>> to call remove: com.abc.hps.vvv.security.bom.helpers.UserRole@595,
>>>>>>> try
>>>>>>> merging the detached and try the remove again.
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.performRemove(UnitOfWorkImpl.java:3559)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.eclipse.persistence.internal.jpa.EntityManagerImpl.remove(EntityManagerImpl.java:518)
>>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
>>>>>>> Method)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>>>>> at java.lang.reflect.Method.invoke(Method.java:597)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365)
>>>>>>> at $Proxy640.remove(Unknown Source)
>>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
>>>>>>> Method)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>>>>> at java.lang.reflect.Method.invoke(Method.java:597)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
>>>>>>> at $Proxy640.remove(Unknown Source)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> com.abc.hps.vvv.common.dao.eclipselink.EclipseLinkDAO.deleteObject(EclipseLinkDAO.java:179)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> com.abc.hps.vvv.dao.eclipselink.EclipseLinkSecurityDAO.setRoles(EclipseLinkSecurityDAO.java:212)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> com.abc.hps.vvv.security.impls.vvvSecurityImpl.setRoles(vvvSecurityImpl.java:401)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> com.abc.hps.vvv.security.impls.vvvSecurityImpl.setRoles(vvvSecurityImpl.java:412)
>>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
>>>>>>> Method)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>>>>> at java.lang.reflect.Method.invoke(Method.java:597)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.aop.joinpoint.MethodInvocation.invokeTarget(MethodInvocation.java:122)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:111)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.ejb3.EJBContainerInvocationWrapper.invokeNext(EJBContainerInvocationWrapper.java:69)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.ejb3.interceptors.aop.InterceptorSequencer.invoke(InterceptorSequencer.java:73)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.ejb3.interceptors.aop.InterceptorSequencer.aroundInvoke(InterceptorSequencer.java:59)
>>>>>>> at sun.reflect.GeneratedMethodAccessor369.invoke(Unknown
>>>>>>> Source)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>>>>> at java.lang.reflect.Method.invoke(Method.java:597)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.aop.advice.PerJoinpointAdvice.invoke(PerJoinpointAdvice.java:174)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.fillMethod(InvocationContextInterceptor.java:72)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_fillMethod_1937287906.invoke(InvocationContextInterceptor_z_fillMethod_1937287906.java)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.setup(InvocationContextInterceptor.java:88)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_setup_1937287906.invoke(InvocationContextInterceptor_z_setup_1937287906.java)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.ejb3.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:62)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:56)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>>>>>>> at
>>>>>>> org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:68)
>>>>>>> at
>>>>>>>
>>>>>>>
>>>>>>> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>>>>>>> at
>>>>>>> org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
>>>>>>> ... 96 more
>>>>>>> 12:51:28,665 INFO [STDOUT]:152 12:51:28,664 TRACE
>>>>>>> [ClassPathXmlApplicationContext]:301 Publishing event in
>>>>>>> ApplicationContext 'vvvWebBeanFactory':
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> org.springframework.security.access.event.PublicInvocationEvent[source=FilterInvocation:
>>>>>>> URL: /abcrw/js/abc/assets/set2/delete_16.png]
>>>>>>>
>>>>>>> We are using eclipselink 2.4.0 and are running in a jboss 5.1.0.GA
>>>>>>> container. Please help !!! I just dont understand why it is not able
>>>>>>> to remove .. May be i am missing something
>>>>>>>
>>>>>>> Cheers
>>>>>>> Vaidya
>>>>>>
>>>>>> _______________________________________________
>>>>>> eclipselink-users mailing list
>>>>>> eclipselink-users@xxxxxxxxxxx
>>>>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> eclipselink-users mailing list
>>>>> eclipselink-users@xxxxxxxxxxx
>>>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>>>>
>>>> _______________________________________________
>>>> eclipselink-users mailing list
>>>> eclipselink-users@xxxxxxxxxxx
>>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> eclipselink-users mailing list
>>> eclipselink-users@xxxxxxxxxxx
>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>>
>> _______________________________________________
>> eclipselink-users mailing list
>> eclipselink-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users