Google app engine 无法将从事务中获取的实体与Objectify中的另一个实体关联
我对Objectify中的实体关系有一些问题。我的应用程序是一个事件应用程序,其中事件具有不同类别的门票;每个票证都由一个用户拥有。我有一个父/子层次结构,如so Event>TicketType>Ticket。所以,事件是TicketType的@Parent,它是Ticket的@Parent 以下是我的实体: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
@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");
}