0

Objectify のエンティティ関係に問題があります。私のアプリケーションは、イベントにさまざまなカテゴリのチケットがあるイベント アプリケーションです。各チケットはユーザーが所有します。Event > TicketType > Ticket のような親子階層があります。したがって、Event は @Parent of Ticket である TicketType の @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;
    ...
}

次のように、トランザクション内でイベントを作成します。

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;
    }

});

返された を使用して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);

Event.generateTicket(...) 内で、次のことを行います。

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");
}

私の問題は、親子関係Eventがすべてのイベント/チケットタイプのリストを適切に持っているエンティティでのみ尊重されているように見えることです (ticketTypesフィールドを介して) Set<Ref<TicketType>>。しかし、TicketTypeエンティティにはチケットのリストがありません (ticketsフィールドは null であるため、保存されません)、反対方向では、 のTicketType親参照Ticketは null であり、上記の両方のケースで行った割り当てにもかかわらず、のEvent親参照も同様です。TicketType

私は何を間違っていますか?

4

1 に答える 1

0

ここであなたが何か間違ったことをしているとは思いません。ただし、Objectify は 1 対多の関係を自動的にロードしないと思います。すべてのチケット タイプを取得する適切な方法は、最初にイベント エンティティをロードしてから、チケット タイプの祖先クエリを実行することです。

アドバイス: リレーショナル データベースでテーブルを設計するように、エンティティを設計しているようです。このような概念は、データストアには適用されません。objectify の概要で述べたように、データストアをハッシュマップのハッシュマップとして想像する必要があります。チケット エンティティのチケット タイプの列挙値を含む複数値属性を使用することは可能かもしれません。エンティティが少ないことは、データストアでは常に良いことです。

于 2013-01-09T15:16:55.307 に答える