I've been struggling to get batch gets working with Spring and JPA.  I
am basically trying to build a category tree for an e-commerce site.
The issues I am running in to seem to be related to transactions.  I
had set my DAO class for the Category entity to be @Transactional.
Everything seemed to be working, till I tried performing a batch get
query based on Max Ross' post (http://gae-java-
persistence.blogspot.com/2009/10/executing-batch-gets.html).  The
first error I got said that I was operating on multiple entity groups
in the same transaction.  I found this confusing because it listed two
Category entities and their id's.  So my first question is:
Can you only operate on one logical record at a time in a
transaction?  I figured since I was working on the same entity -
Category, I should be OK. If each instance of a Category is considered
a separate entity group, then I guess the behavior is correct.

My next approach was to remove the @Transactional annotation for the
batch get.  When I do this, I now get:
Object Manager has been closed
org.datanucleus.exceptions.NucleusUserException: Object Manager has
been closed
This occurs withing the DAO Method.  Here is the code:
        @Override
        //@Transactional
        public List<Category> getCategoriesByIds(List<Long> ids) {
              final Query query = entityManager.createQuery(
              "SELECT FROM Category c WHERE id = :ids");
              query.setParameter("ids", ids);
              List<Category> results = query.getResultList();
              return results;
}
Note: the @Transactional is commented out
The error occurs right when "query.getResultList()" is called in the
method.  I don't understand how the object manager can already be
closed.

I have been calling the above method from a unit test.  Any help would
be appreciated.


The entities look like the following:

@Repository
@Entity
public class Category implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;

        private Long memberId;

        private String identifier;

        private Boolean markForDelete;

        private Date lastUpdate;

        @OneToMany(mappedBy = "category", cascade = CascadeType.ALL)
        private Set<CategoryDescription> categoryDescriptions = new
HashSet<CategoryDescription>();

        .... Getters and Setters
}

@SuppressWarnings("serial")
@Repository
@Entity
public class CategoryDescription implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Key key;

        @ManyToOne(fetch = FetchType.LAZY)
        private Category category;

        private String language;

        private String name;

        private String shortDescription;

        private Text longDescription;

        private Text note;

        private String keywords;
}

@SuppressWarnings("serial")
@Repository
@Entity
public class CategoryRelationship {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;

        private Long parentCategoryId;

        private Long childCategoryId;

        private Long catalogId;

        private Double sequence;

        private Date lastUpdate;
}


Thanks,
Michael

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to