Skip to main content

[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..

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


Back to the top