About documentation this is a good start point:
http://code.google.com/appengine/docs/java/overview.html
Respect to many to many relationship from http://code.google.com/appengine/docs/java/datastore/jdo/relationships.html :
We can model a many-to-many relationship by maintaining collections of
keys on both sides of the relationship. Let's adjust our example to
let Food keep track of the people that consider it a favorite:
Person.java
import java.util.Set;
import com.google.appengine.api.datastore.Key;
// ...
@Persistent
private Set favoriteFoods;
Food.java
import java.util.Set;
import com.google.appengine.api.datastore.Key;
// ...
@Persistent
private Set foodFans;
In this example, the Person maintains a Set of Key values that
uniquely identify the Food objects that are favorites, and the Food
maintains a Set of Key values that uniquely identify the Person
objects that consider it a favorite. When modeling a many-to-many
using Key values, be aware that it is the app's responsibility to
maintain both sides of the relationship:
Album.java
// ...
public void addFavoriteFood(Food food) {
favoriteFoods.add(food.getKey());
food.getFoodFans().add(getKey());
}
public void removeFavoriteFood(Food food) {
favoriteFoods.remove(food.getKey());
food.getFoodFans().remove(getKey());
}