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);
}
}