Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Disappearing Items from a Collection

Very odd.

Setting,
<property name="eclipselink.cache.shared.default" value="false"/>

Is enough to disable the cache, do not set,
<property name="eclipselink.cache.size.default" value="0"/>
<property name="eclipselink.cache.type.default" value="None"/>

But, given it still occurs with the cache disabled, it does not appear to be
a cache issue.  It seems to be a database/transactional issue.  You could
confirm this by executing a native SQL query through the same EntityManager
before calling size, to see what result you get back.

What does your,  persistenceSvc.beginTx() and
persistenceSvc.getEntityManager() methods do?
If you call em.clear(); before calling the find() and size, do you get the
same result?

You may want to try a different database, to confirm if it is a database
issue.  Are you using innodb with MySQL, can you try using it?


Tim McNerney wrote:
> 
> I'm running into an issue where I add an object to a collection which
> is a member of another collection. When retrieving the top level item
> on a subsequent call, the new item is sometimes in the collection and
> sometimes is not. I can confirm that it is getting saved to the
> database. Let me map out a general outline of the code in question.
> 
> @Entity
> @Table(name = "base")
> @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
> @DiscriminatorColumn(name = "type", discriminatorType =
> DiscriminatorType.INTEGER)
> public abstract class Base  {
>  protected Collection<Sub> sub;
> 
>  @OneToMany(mappedBy = "base", cascade = CascadeType.REMOVE, fetch =
> FetchType.LAZY)
>  public Collection<Sub> getSubs() {
>    return this.subs;
>  }
> 
>  public void setSubs(Collection<Sub> subs) {
>    this.subs = subs;
>  }
> 
>  public void addSub(Sub sub) {
>    this.subs.add(sub);
>    sub.setPost(this);
>  }
> }
> 
> @Entity
> @DiscriminatorValue("2")
> public class Top extends Base {
> }
> 
> @Entity
> @Table(name = "sub")
> public class Sub {
>    private Top top;
> 
>  @ManyToOne(cascade = {}, fetch = FetchType.EAGER)
>  @JoinColumn(name = "base_id", referencedColumnName = "id")
>  public Top getTop() {
>    return this.top;
>  }
> 
>  public void setTop(Top top) {
>    this.top = top;
>  }
> 
> public class SubDAO {
> public static void createSub(Integer topId, Sub sub) {
> try {
>   persistenceSvc.beginTx();
>   em = persistenceSvc.getEntityManager();
>   Base base = em.find(Base.class, id);
>   base.addSub(sub);
>   em.persist(vote);
>   persistenceSvc.commitTx();
>   em.refresh(base);
>   em.refresh(sub);
>   } finally {
>   persistenceSvc.close();
>   }
> }
> 
> I'm obviously leaving out quite a bit, due to space, but I can expand
> as necessary. I only provide the general outline to help folks follow
> what happens.
> 
> So I create the new object (Sub), add it to the Collection in the
> Base. Later I retrieve the Top (extends Base) and sometimes it has the
> new item and sometimes it does not (if I do a restart of the app
> server, it always has the item). The code for retrieval looks a little
> something like:
> 
> try {
>   persistenceSvc.beginTx();
>   em = persistenceSvc.getEntityManager();
>   Top top = em.find(Top.class, topId);
>   em.refresh(question);
>   System.out.println("size: " + top.getSubs().size());
>   persistenceSvc.commitTx();
>   return top;
>  } finally {
>   persistenceSvc.close();
>  }
> 
> I do the size to ensure that I instantiate the Collection. If I run
> this code repeatedly after having added a single Sub to a Top that
> already had a Sub in the collection, I'll see something like:
> 
> size: 2
> size: 2
> size: 2
> size: 1
> size: 2
> size: 1
> 
> I wanted to make sure that I wasn't seeing a caching issue, so I added
> the following in my persistence.xml:
> 
> <property name="eclipselink.cache.shared.default" value="false"/>
> <property name="eclipselink.cache.size.default" value="0"/>
> <property name="eclipselink.cache.type.default" value="None"/>
> 
> When I turn the logging up to FINE, I can see it doing the database
> call each time I fetch
> 
> [EL Fine] .... SELECT ... FROM sub WHERE base_id = ?
>   [123]
> 
> I can see that there are two items matching that query by doing it
> directly to the database. Yet I get alternate return sizes of 1 and 2.
> Again, if I restart the server, I'll only get 1. Only the newly added
> entry appears and disappears.
> 
> Some details of my configuration. Tomcat 6.0.x. Eclipselink 1.1.2,
> 1.1.3, 1.2.0 (tried the newer versions when they came out to see if
> there was a bug that had been solved). MySQL 5.1. JDBC connection,
> both through JNDI and an explicit connection. I'm using RESOURCE_LOCAL
> for the transaction-type. I set the eclipselink.target-database, but
> that is it in terms of properties (expect as above when testing
> without caching).
> 
> I was able to finally get correct behavior by changing the fetching to
> EAGER instead of LAZY. But I don't want to have to do that and I'd
> like to understand this unexpected behavior so I can avoid it in the
> future.
> 
> I know there is probably not enough info for a definitive conclusion,
> but I'm looking for suggestions as to where to look, what might be the
> cause and whether or not there are known bugs which might result in
> this behavior. I'm happy to turn up logging to try and trace things or
> even set breakpoints in the code. If you need more information, let me
> know.
> 
> I don't have a simple, reproducible test case or I'd file a bug.
> 
> Any help or tips would be greatly appreciated. Thanks.
> 
> --Tim
> 
> 


-----
http://wiki.eclipse.org/User:James.sutherland.oracle.com James Sutherland 
http://www.eclipse.org/eclipselink/
 EclipseLink ,  http://www.oracle.com/technology/products/ias/toplink/
TopLink 
Wiki:  http://wiki.eclipse.org/EclipseLink EclipseLink , 
http://wiki.oracle.com/page/TopLink TopLink 
Forums:  http://forums.oracle.com/forums/forum.jspa?forumID=48 TopLink , 
http://www.nabble.com/EclipseLink-f26430.html EclipseLink 
Book:  http://en.wikibooks.org/wiki/Java_Persistence Java Persistence 
-- 
View this message in context: http://old.nabble.com/Disappearing-Items-from-a-Collection-tp26119215p26160182.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top