wypracowałem 3 alternatywy, które mogą rozwiązać ten problem, który jest bardzo ważny IMHO.
---- 1-ta alternatywa ----
Jeśli podróż identyfikator jest obliczany z innego atrybutu, istnieje sposób. Zamiast pobierania Trip
przez jego id
uzyskać z tej innej obliczonej właściwości. Wyobraźmy sobie, że identyfikator Twojej podróży jest obliczany na podstawie pewnej nazwy kanonicznej (A URN, którą wyprowadzasz z pełnego tytułu), np. jeśli pełna nazwa TRIP jest
Voyage do Everest
Twoja nazwa kanoniczna może być voyage-to-the-everest
i to jest String użyć jako nazwę dla klucza. Więc zamiast się element używając datastore.get
zastosowanie:
@Override
public Optional<Trip> findById(String tripCanonicalName) {
StructuredQuery.PropertyFilter eqTripCanonicalName = StructuredQuery.PropertyFilter
.eq("canonicalName", tripCanonicalName);
EntityQuery query = Query.newEntityQueryBuilder().setKind("Trip")
.setFilter(eqTripCanonicalName).setLimit(1).build();
QueryResults<Entity> results = getDatastoreService().run(query);
if (results.hasNext()) {
return Optional.of(fromEntity(results.next()));
}
return Optional.empty();
}
to dostanie jednostki (Trip
) bez względu na to, którego rodzic (User
) być.
---- 2-ta alternatywa ----
Przed wejściem elementu prawdopodobnie najpierw trzeba je wymienić, a następnie wybrać jedną i przejdź do łącza dostępowego. Jak wiemy z wykorzystaniem identyfikatora zadania przyzwyczajenie wystarczy, ponieważ będzie to unikalna tylko dla jego rodzica (User
), ale zamiast pokazywać, że id
można użyć bezpiecznego identyfikatora URL:
entity.getKey().toUrlSafe()
więc w konwersji od obiektu do obiektu przypisz element Task
, którego identyfikator jest zakodowany w base-64 encode.Aby odzyskać klucz z bezpiecznego adresu URL, należy użyć tej opcji, aby zagwarantować, że zawsze będziesz używał globalnego unikalnego identyfikatora.
---- 3-cie alternatywa ----
Korzystanie HATEOAS można podać link do accesing się Task
, więc jeśli zadanie ma jakiś identyfikator taki jak parentId
lub userId
który jest w zasadzie uzyskanie jego rodzica ID węzła, to może być bardzo łatwo można utwierdzi się link wskazujący url jak ten
http://base-url.com/users/ {} userid/zadania/{taskId}
więc we wniosku hateoas to może wskazuje się w linki, które wskazuje dozwolony działania dla elementu, więc do oglądania wykorzystywać element self
np
{
"id": "voyage-to-the-everest",
"name":"Voyage to the Everest",
"userId": "my-traveler-user-id",
"_links":{
"self":{
"href":"http://localhost:8080/users/my-traveler-user-id/tasks/voyage-to-the-everest
}
}
}
Jeśli zamiast userId
używasz parentId
można się dogadać z interfejsem gdzie wszystko węzły określają, czy mają rodzica, czy nie. Nawet to może być bardziej elastyczna z parent
nieruchomości, gdzie można zdefiniować całą hierarchię nadrzędny:
public interface DatastoreNode{
String getParentId();
String getParentKind();
String getParentUrlTag();
DatastoreNode getParent();
}
Chociaż hateoas Zaleca można wywnioskować tej samej zawartości mający strukturę json takich jak
{
"id": "voyage-to-the-everest",
"name":"Voyage to the Everest",
"parent": {
parentKind: "User",
parentId: "my-traveler-user-id",
parentUrlTag: "users",
parent: {}
}
}
+1 - to doskonale słuszne pytanie. Kto udzielił -1-opieki, aby wyjaśnić? –
Dlaczego nie korzystasz z wyszukiwania? [see] [1] [1]: http://stackoverflow.com/questions/12675664/create-a-good-looking-url-for-a-key-with-ancestors/12676004#comment17106761_12676004 –
@ Lapteuh - Czy spojrzałeś nawet na odpowiedź, której dotyczysz? Zapytanie, które proponuje, wymaga pełnego klucza nadrzędnego (rodzaju + id/nazwy) i właśnie to OP nie ma. –