2012-02-21 15 views
5

Mam 2 obiekty, ObjectA i ObjectB.Jak mogę mieć opcjonalną relację jeden-do-jednego w GORM?

Kiedy ObjectA zostanie utworzony, ObjectB nie robi (i nie może, ze względu na które nie mają jeszcze danych) jeszcze istnieje.

Po utworzeniu ObjectB konieczne jest posiadanie odpowiadającego ObjectA dołączonego do niego , jeśli odpowiedni istnieje. Jeśli nie ma odpowiedniego ObjectA, nowy ObjectB po prostu nie jest podłączony do jednego.

Więc wszystkie ObjectA przypadki będą ostatecznie być dołączone do ObjectB, ale nie wszystkie ObjectB przypadki będą miały ObjectA.

Zasadniczo szukam GORM zbudować tabele bazy danych tak:

ObjectA 
- Id (NotNull, unique) 
- ObjectB_Id[FK: ObjectB.Id] (unique) 

ObjectB 
- Id (NotNull, unique) 

Jak mogę połączyć klas domen Gorm to zrobić?

Próbowałem prawie każda kombinacja hasOne, belongsTo, surowe właściwości, nullable: true i unique: true ograniczeń mogę myśleć, ale musi być brakuje jednego. Wydaje się, że nie jest to szczególnie scenariusz nieparzysty, więc musi być musi być być pewien sposób, aby to osiągnąć.

Odpowiedz

5

Jak to często bywa, kładąc moje myśli razem w pytaniu doprowadzić mnie do rozwiązania:

Class ObjectA { 
    ObjectB objectB 

    static constraints = { 
     objectB nullable: true, unique: true 
    } 
} 

Class ObjectB { 
    static belongsTo = [objectA: ObjectA] 

    static constraints = { 
     objectA nullable: true 
    } 
} 

Jedyny haczyk z tym, że nie może wydawać się, aby ominąć to, że jest możliwe, aby ustawić ObjectB.objectA do ObjectA, który jest już powiązany z ObjectB. Podczas zapisywania nowego powiązania GORM po prostu nie zapisuje powiązania. Nie są zgłaszane żadne błędy, a wyciągnięcie nowego ObjectB z bazy danych pozostawia niezałasowaną właściwość objectA.

Dodanie unique: true do ograniczeń w klasie ObjectB również nie pomaga. Zamiast cichej awarii, zgłaszany jest błąd wskazujący, że kontrola unikalności kończy się niepowodzeniem z powodu nieokreślonego parametru.

Powiązane problemy