2009-10-13 14 views
7

Próbuję dowiedzieć się, jak egzekwować wyjątkowość w dziedzinach innych niż unikatowy identyfikator.Jak wymusić unikalną wartość pola w java Google App Engine

Przykład:

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class User implements IsSerializable { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String name; 

    @Persistent 
    private String email; // <= I want this to be unique as well 
} 

W powyższym przykładzie, w jaki sposób można wymusić unikalność wartości poczty elektronicznej w bazie danych?

Daniel

Odpowiedz

11

Obecnie nie ma żadnych wbudowanych elementów za pomocą danych magazynu aplikacji. Zobacz na przykład this datanculeus ticket. (Zauważ, że samo JDO ma adnotację @unikalną.)

Jednym ze sposobów na "podrabianie" byłoby stworzenie innego rodzaju/klasy o nazwie E-mail z samym e-mailem jako kluczem, a kluczem użytkownika jako właściwością. Ponieważ wiadomość e-mail jest teraz kluczem, będzie musiała być unikalna. Upewnij się tylko, że twoje encje Email są jednostkami najwyższego poziomu, a nie dziećmi ich powiązanego użytkownika. Będziesz także musiał zwracać szczególną uwagę na korzystanie z transakcji, aby upewnić się, że duplikat nie przejdzie przez pęknięcia, jeśli dwóch użytkowników spróbuje użyć tego samego e-maila w tym samym czasie.

1

Ta funkcja nie jest jeszcze obsługiwana. Jeśli zdecydowałeś się napisać warstwę DAO w swoim projekcie (To nie jest zły pomysł), możesz wykonać zapytanie, które przetestuje wszelkie limity, które chcesz w MyObjectDAO.addMyObject (o), które spowodują wyjątek MySuperDuplicateValueException.

6

Napisałem klasę, która dba o całą funkcjonalność dodawania Unikatowych pól do encji App Engine. Proszę go używać.

Wtyczka ta klasa w projekcie i po prostu dodać GET i aktualizacji metod i podać nazwę podmiotu, nazwy pola i niepowtarzalną wartość pola

Kod źródłowy jest dostępny tutaj:

http://code.google.com/p/appengine-uniquefields/

+0

To działało ładnie dla moich potrzeb. całkiem sprytny. – Patrick

+0

Cieszę się, że pomogło :) –

+0

Przyjemne podejście, zacząłem robić coś podobnego do opisanego powyżej Peter Recore, ale to rozwiąże moje problemy równie dobrze, a przy znacznie mniejszym kodzie. –