L2 cache issue

459 views
Skip to first unread message

Sam

unread,
Aug 23, 2012, 12:43:37 PM8/23/12
to eb...@googlegroups.com
I have two classes A and B with a bi-directional oneToMany relation between A and B.
Both classes A and B have L2 cache activated (@CacheStrategy annotation).

If I try to delete an object instance of type B I get the following error:

Aug 23, 2012 6:24:24 PM com.avaje.ebeaninternal.server.transaction.TransactionManager notifyOfCommit
SEVERE: NotifyOfCommit failed. Cache/Lucene potentially not notified.
java.lang.RuntimeException: get classeA on [model.ClasseB] type[com.avaje.ebeaninternal.server.core.PersistRequestBean] threw error.
    at com.avaje.ebeaninternal.server.deploy.BeanProperty.getValue(BeanProperty.java:880)
    at com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocOne.cacheDelete(BeanPropertyAssocOne.java:155)
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptor.cacheDelete(BeanDescriptor.java:1167)
    at com.avaje.ebeaninternal.server.core.PersistRequestBean.notifyCache(PersistRequestBean.java:233)
    at com.avaje.ebeaninternal.api.TransactionEventBeans.notifyCache(TransactionEventBeans.java:55)
    at com.avaje.ebeaninternal.api.TransactionEvent.notifyCache(TransactionEvent.java:214)
    at com.avaje.ebeaninternal.server.transaction.PostCommitProcessing.notifyLocalCacheIndex(PostCommitProcessing.java:88)
    at com.avaje.ebeaninternal.server.transaction.TransactionManager.notifyOfCommit(TransactionManager.java:468)
    at com.avaje.ebeaninternal.server.transaction.JdbcTransaction.notifyCommit(JdbcTransaction.java:549)
    at com.avaje.ebeaninternal.server.transaction.JdbcTransaction.commit(JdbcTransaction.java:602)
    at com.avaje.ebeaninternal.server.core.BeanRequest.commitTransIfRequired(BeanRequest.java:97)
    at com.avaje.ebeaninternal.server.persist.DefaultPersister.delete(DefaultPersister.java:472)
    at com.avaje.ebeaninternal.server.core.DefaultServer.delete(DefaultServer.java:1886)
    at com.avaje.ebeaninternal.server.core.DefaultServer.delete(DefaultServer.java:1876)
    at com.avaje.ebean.Ebean.delete(Ebean.java:666)
    at MainEbean.main(MainEbean.java:37)
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.avaje.ebeaninternal.server.deploy.BeanProperty.getValue(BeanProperty.java:875)
    ... 15 more

Any suggestions? Is this a bug?

Thanks.

Here is the code for classes A and B and the main class:

******************* class A **********************
@Entity
@Table(name = "classeA")
@CacheStrategy(readOnly = false)
public class ClasseA{

    public List<ClasseB> getClasseBs() {
        return classeBs;
    }
   
   
   

    public void setClasseBs(List<ClasseB> classeBs) {
        this.classeBs = classeBs;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Id
    private Integer id;

    private String name;

    @OneToMany(cascade = { CascadeType.ALL }, orphanRemoval = true, mappedBy = "classeA")
    private List<ClasseB> classeBs;

}

******************* class B **********************
@Entity
@Table(name = "classeB")
@CacheStrategy(readOnly=false)
public class ClasseB{

    public ClasseA getClasseA() {
        return classeA;
    }

    public void setClasseA(ClasseA classeA) {
        this.classeA = classeA;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Id
    private Integer id;

    @ManyToOne(fetch = FetchType.LAZY)
    private ClasseA classeA;


    private String name;

}

************ Main **************************
public class MainEbean {

    /**
     * @param args
     */
    public static void main(String[] args) {

       
        ClasseA a=new ClasseA();
        a.setId(new Integer(0));
       
        try{
            Ebean.save(a);
        }catch(Exception e){/* already exists */}
       
        a=Ebean.find(ClasseA.class, a.getId());
        ClasseB b = new ClasseB();
        b.setId(0);
        b.setClasseA(a);

        try{
            Ebean.save(b);
        }catch(Exception e){/* already exists */}

        b=Ebean.find(ClasseB.class, b.getId());
        Ebean.delete(b);
    }

}


Wolfgang Buchner

unread,
May 13, 2013, 8:12:09 AM5/13/13
to eb...@googlegroups.com
i am getting the same error in version 3.1.2.

I investigated the cause deeper and this is a bug in my opinion.

BeanDescriptor.cacheDelete() is calling BeanPropertyAssocOne.cacheDelete() with the wrong parameter.

It is using the DeleteRequest itself as parameter instead of deleteRequest.getBean().

I will post an issue for that and create an unit test if i have time.

Am Sonntag, 27. Januar 2013 16:20:23 UTC+1 schrieb mark walker:
I'm Getting the same problem.  Using Playframework 2.1rc1.

Did you figure out a fix?

Thanks

Wolfgang Buchner

unread,
May 17, 2013, 3:07:55 AM5/17/13
to eb...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages