[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