Google app engine 无法将从事务中获取的实体与Objectify中的另一个实体关联

Google app engine 无法将从事务中获取的实体与Objectify中的另一个实体关联,google-app-engine,entity-relationship,objectify,Google App Engine,Entity Relationship,Objectify,我对Objectify中的实体关系有一些问题。我的应用程序是一个事件应用程序,其中事件具有不同类别的门票;每个票证都由一个用户拥有。我有一个父/子层次结构,如so Event>TicketType>Ticket。所以,事件是TicketType的@Parent,它是Ticket的@Parent 以下是我的实体: @Entity public class Event { ... @Load private Set<Ref<TicketType>> t

我对Objectify中的实体关系有一些问题。我的应用程序是一个事件应用程序,其中事件具有不同类别的门票;每个票证都由一个用户拥有。我有一个父/子层次结构,如so Event>TicketType>Ticket。所以,事件是TicketType的@Parent,它是Ticket的@Parent

以下是我的实体:

@Entity
public class Event {
    ...
    @Load
    private Set<Ref<TicketType>> ticketTypes = new HashSet<Ref<TicketType>>();
    ...
}

@Entity
public class TicketType {
    ...
    @Parent
    private Ref<Event> event;
    ...
}

@Entity
public class Ticket {
    ...
    @Parent
    @Load
    private Ref<TicketType> ticketType;
    ...
}
内部事件。GenerateCket(…),我做:

public synchronized Ticket generateTicket(字符串类型)抛出IllegalArgumentException{
对于(参考:票证类型){
TicketType tt=reftt.get();
if(tt.getType().equalsIgnoreCase(类型)){
如果(tt.getAvailable()>0){
票证newTicket=新票证(RandomGenerator.nextNumber(票证编号和长度),tt);
setExpirationDate(getEndDate());
//在这里,我为这个新票证设置父票证类型实体
newTicket.setTicketType(tt);
//此类型的可用票证数量减少
tt.setAvailable(tt.getAvailable()-1);
返回newTicket;
}否则返回null;
}
}
抛出新的IllegalArgumentException(“无此类类型”);
}
我的问题是,父/子关系似乎只在正确拥有所有事件/票证类型列表的
事件
实体上受到尊重(通过
票证类型
字段,这是一个
集合
。但是,
票证类型
实体没有票证列表(票证字段为空,因此未保存),在另一个方向上,
Ticket
中的
TicketType
父引用为空,
TicketType
中的
事件
父引用也为空,尽管我在上述两种情况下都做了赋值


我做错了什么?

我不认为您在这里做错了什么。但是我相信Objectify不会自动加载一对多关系。获取所有票证类型的正确方法是首先加载事件实体,然后对票证类型执行祖先查询

一些建议:
看起来您正在设计实体,就像在关系数据库中设计表一样。此类概念不适用于数据存储。如objectify简介中所述,您应该将数据存储想象为hashmap的hashmap。在t中使用包含票证类型枚举值的多值属性可能是可行的icket实体。在数据存储中,减少实体总是一件好事。

感谢您的回复。我在文档中看到@Load注释也适用于实体集合,这意味着票证类型应该与事件实体一起加载。我理解错了吗?还有,我创建作为实体的票证类型的原因是s因为票证类型有许多属性,并且可能有与之相关的行为(有多少可用?、价格、折扣政策等)。您能给我一个具体的代码示例吗?
Event ev = ofy().transact(new Work<Event>() {

    @Override
    public Event run() {
    // several statements constructing the event
        ev.setXXXX(X);
    ofy().save().entity(ev).now();
        // Now construct the TicketType entity, then associate it to its parent, Event
    TicketType tt1 = new TicketType("normal", 100, 7);
    tt1.setEvent(ev);
        ofy().save().entity(tt1).now();
        return ev;
    }

});
// Generate a VIP ticket
Ticket ticket1 = ev.generateTicket("vip");
// I set the owner with an already saved User entity
ticket1.setOwner(cl);
ofy().save().entity(ticket1).now();
// The user also has a list of all his tickets
cl.addTicket(ticket1);
public synchronized Ticket generateTicket(String type) throws IllegalArgumentException {
    for (Ref<TicketType> reftt : ticketTypes) {
        TicketType tt = reftt.get();
        if (tt.getType().equalsIgnoreCase(type)) {
            if (tt.getAvailable() > 0) {
                Ticket newTicket = new Ticket(RandomGenerator.nextNumber(TICKET_NUMBER_LENGTH), tt);
                newTicket.setExpirationDate(getEndDate());
                // here I set the parent TicketType entity for this new Ticket
                newTicket.setTicketType(tt);
                // the number of available tickets of this type is decreased
                tt.setAvailable(tt.getAvailable() - 1);
                return newTicket;
            } else return null;
        }
    }
    throw new IllegalArgumentException("No such type");
}