Hey guys,

I am in the middle of porting the Apache Jetspeed Portal from OJB to JPA and JTA using Spring and Extended EntityManagers. I am using the released version of JPA, OpenJPA 1.2.0. So far so good, but I do have a question concerning eviction from the query cache: if I have a relationship between two objects that is manifest only in JPQL statements, will inserts against one object table clear a query cache that contains results for the other object?

Here is a more detailed description of the situation.

@Entity
@NamedQuery (name="ABA", query="select a from A a, B b, A a2 where a2.name = :name 
and a2.id = b.id0 and b.id1 = a.id")
Class A
{
   @Id
   private Long id;
   @Basic
   private String name;
   ...
}

@Entity
Class B
{
   @Id
   private Long id0;
   @Id
   private Long id1;
   ...
}

Note the NamedQuery is the only relationship between class A and B Open JPA could be aware of since there are no *ToMany or *ToOne declared. Here is what I am observing based on trace logging:

1. Query for a list of A using query ABA and get no results, (OpenJPA generates and executes a correct select SQL), 2. Persist a new instance of B such that the original query should be satisifed, (OpenJPA generates and executes the corresponding insert SQL), and 3. Reissue the original query for a list of A using query ABA: unexpectedly returns no results, (OpenJPA indicates a cache hit and no SQL is logged).

I can easily imagine that OpenJPA would not automatically find and maintain this programmatic relationship between A and B. However, the documentation on query cache eviction seems to claim it might because clearly B is in the "access path" of A based on the ABA query. Consequently, it claims query results for A would have been cleared by the insert of a B instance.

No doubt there are work arounds here including manual eviction based on class A and I am going to start experimenting to find the one that works best in this case. I am also going to look into using the 'timestamp' eviction policy to see if that helps. I am posing the question though to make sure I am not totally in left field. I assume that if I actually modeled the relationships between A and B explicitly, I would not have run into this behavior, correct?

Thanks for the assistance/clarification in advance,

Randy Watler
Jetspeed2 Committer

Reply via email to