2015-04-01 21 views
6

Moja struktura bazy danych składa się głównie z wielu kluczy podstawowych na tabelę, w związku z tym wymagane są liczne kolumny dla każdego sprzężenia. Próbuję użyć ColdFusion (11 to be specific) ORM collection property. Wygląda na to, że rozdzielona przecinkami lista kolumn w atrybucie fkColumn nie działa, tak jak w przypadku relationship properties. Mam filed a bug with Adobe, ale zastanawiam się, czy ktoś jeszcze do tego nie doszedł i znalazł obejścia. A może jestem po prostu robi to źle ..ColdFusion: Kolekcja ORM z wieloma kluczami obcymi

Tabela konfiguracji

Years  Staff   StaffSites Sites 
=========== ============ ============ =========== 
YearID (PK) StaffID (PK) YearID (PK) SiteID (PK) 
YearName  StaffName  StaffID (PK) SiteName 
          SiteID (PK) 

Staff ORM CFC

component persistent=true table='Staff' { 
    property name='id' column='StaffID'  fieldType='id'; 
    property name='year' column='YearID'  fieldType='id'; 
    property name='sites' elementColumn='SiteID' fieldType='collection' table='StaffSites' fkColumn='StaffID,YearID'; 
} 

Problem

jest błąd podczas generowania wygenerowanego zapytania: [Macromedia][SQLServer JDBC Driver][SQLServer]An expression of non-boolean type specified in a context where a condition is expected, near ','.

Przyjrzawszy się wygenerowanemu zapytaniu, wydaje się, że lista kolumn nie jest prawidłowo przeanalizowana pod kątem klauzuli where, ale w pewnym stopniu rozumie, że w wyrażeniu select znajduje się wiele kolumn.

select 
    sites0_.StaffID, 
    YearID as StaffID1_2_0_, 
    sites0_.SiteID as SiteID4_0_ 
from 
    StaffSites sites0_ 
where 
    sites0_.StaffID,YearID=? 

poprawnie obsługują multi-key "join" Cel

Dla właściwości zbierania ORM. Dlaczego nie skorzystać z relacji? Chciałbym użyć obiektów ORM, aby następnie serializować jako JSON do użytku w usługach REST. Zserializowany JSON musi zawierać identyfikator relacji, a nie rzeczywiste dane relacji. Na przykład, ładunek JSON powinno być:

{ 
    "id": 1234, 
    "year": 2015, 
    "sites": [1,2,3] 
} 

Zamiast coś takiego:

{ 
    "id": 1234, 
    "year": 2015, 
    "sites": [ 
     {"id": 1, "name": "Foo"}, 
     {"id": 2, "name": "Bar"}, 
     {"id": 3, "name": "Baz"}, 
    ] 
} 
+0

post próbka oczekiwanego JSON do użytku w służbach resztę. – Henry

+0

@Henry Dodałem przykłady, o które prosiłeś. Dzięki za wszelkie dane wejściowe. Myślałem o używaniu haków ORM do ręcznego pobierania danych "po obciążeniu". Spróbuję tego, kiedy wrócę do tego projektu. – Panman

+0

Wygląda na to, że chcesz ten JSON z encji Staff. Użyj niestandardowego serializera (nowy w CF11) dla 'Staff' i ustaw resztę jako jeden-do-wielu lub wiele-do-wielu z linktable. – Henry

Odpowiedz

0

Dla Twojej struktury DB, najprostszy sposób przekładają się na ORM byłoby użyć „StaffSites” jako linktable dla relacje wiele do wielu.

Należy spróbować CF11 za niestandardowe serializer http://blogs.coldfusion.com/post.cfm/language-enhancements-in-coldfusion-splendor-improved-json-serialization-2

+0

Problem z relacjami polega na tym, że rzeczywiste dane relacji są zawarte w serializowanym JSON. Po serializacji potrzebuję tylko powiązanego identyfikatora, który jest zamiast tego powodem do zebrania. – Panman

+0

@Panman, po co więc korzystać z ORM? :) Wystarczy użyć staroświeckiego cfquery, jeśli wolisz zajmować się identyfikatorami. – Henry

+0

Nadal chciałbym używać innych funkcji ORM; wyszukiwanie, buforowanie itp. Jest to dobry sposób na organizowanie innej logiki biznesowej. – Panman

Powiązane problemy