Forum » Programiranje » [c++] Orm... ActiveRecord pattern ... nasvet
[c++] Orm... ActiveRecord pattern ... nasvet
zhigatsey ::
Živjo,
Malo razmišljam kako bi implementiral ActiveRecord v c++...
Razred naj bi sam na podlagi določenih informacij generiral pravilne insert, update, delete in select sql stavke...
Zato mora poznati vsa polja tabele in katero polje predstavlja glavni ključ...
Mogoče imate kakšen nasvet, kako bi na najbolj eleganten način naredil nekakšno mapiranje med člani razreda in
polji v tabeli "Osebe"..., tako da bi lahko razred ob klicu npr. metode delete() samodejno generiral delete stavek "Delete from Osebe where PersonId = x"...
Hvala za odgovore
Malo razmišljam kako bi implementiral ActiveRecord v c++...
Razred naj bi sam na podlagi določenih informacij generiral pravilne insert, update, delete in select sql stavke...
Zato mora poznati vsa polja tabele in katero polje predstavlja glavni ključ...
class Person : public ActiveRecord { public: Field<int, PRIMARY_KEY> personId; Field<std::string> name; Field<std::string> address; .... .... };
Mogoče imate kakšen nasvet, kako bi na najbolj eleganten način naredil nekakšno mapiranje med člani razreda in
polji v tabeli "Osebe"..., tako da bi lahko razred ob klicu npr. metode delete() samodejno generiral delete stavek "Delete from Osebe where PersonId = x"...
Hvala za odgovore
FlashM ::
Poglej si ActiveWriter, ki ti glede na izdelano shemo podatkovne baze zgenerira tele hbm classe. Pri nas to uporabljamo v kombinaciji z NHibernate-om.
fiction ::
Tukaj je malo dvoumnosti. Eno je ORM drugo pa ActiveRecord pattern nad tem. To drugo je v bistvu samo to, da
se zna razred sam zapisati ali pa prebrati iz baze.
Mi, kot je povedal FlashM, uporabljamo NHibernate za ORM, nad njim pa DAO objekte (namesto tega da bi bili sami objekti s podatki "aktivni"). Ce hoces uporabljati ActiveRecord pattern obstaja kul knjiznica z istim imenom za .NET od CastleProjecta. ActiveWriter od istega podjetja po drugi strani je samo plugin za Visual Studio s katerim lahko rises entitete in ti ta zgenerira .hbm.xml datoteke za NHibernate. To je ta "mapping" med podatki iz razreda in stolpci v relacijski bazi. Seveda lahko uporabljas tudi ActiveRecord in ActiveWriter skupaj. Pogoj je samo NHibernate za ORM.
se zna razred sam zapisati ali pa prebrati iz baze.
Mi, kot je povedal FlashM, uporabljamo NHibernate za ORM, nad njim pa DAO objekte (namesto tega da bi bili sami objekti s podatki "aktivni"). Ce hoces uporabljati ActiveRecord pattern obstaja kul knjiznica z istim imenom za .NET od CastleProjecta. ActiveWriter od istega podjetja po drugi strani je samo plugin za Visual Studio s katerim lahko rises entitete in ti ta zgenerira .hbm.xml datoteke za NHibernate. To je ta "mapping" med podatki iz razreda in stolpci v relacijski bazi. Seveda lahko uporabljas tudi ActiveRecord in ActiveWriter skupaj. Pogoj je samo NHibernate za ORM.
zhigatsey ::
Mi je uspelo narediti tole povezavo med člani razreda in
imeni polj v tabeli.... Vse sem ovil v makroje, tako da je
deklaracija enostavnejša... Makroji za mapiranje mi skupaj
sestavijo metodo, ki vrne mapo
Zgornji primer sedaj izgleda takole...
imeni polj v tabeli.... Vse sem ovil v makroje, tako da je
deklaracija enostavnejša... Makroji za mapiranje mi skupaj
sestavijo metodo, ki vrne mapo
// Ime polja, član razreda map<std::string, FieldBase*>
Zgornji primer sedaj izgleda takole...
class Person : public ActiveRecord { public: virtual ~Person(); // Deklaracija članov razreda FIELD( personId, int, FIELD_PRIMARY ) FIELD( name, std::string, FIELD_NOTNULL ) FIELD( address, std::string, FIELD_NOTNULL ) // Mapiranje med imeni polj v tabeli in člani razreda FIELDS_MAPPING_BEGIN( "PERSONS" ) FIELDS_MAPPING( "PERSONID", personId ) FIELDS_MAPPING( "NAME", name ) FIELDS_MAPPING( "ADDRESS", address ) FIELDS_MAPPING_END };
zhigatsey ::
Zgornja rešitev ni bila najboljša, ker je vsaka instanca razred vsebovala
svojo mapo z mapiranimi imeni polj in kazalci na tip člana razreda...
Namesto običajnih kazalcev sem hotel uporabiti kazalce na člane razreda...
Nastal je problem saj ne morem teh kazalcev spraviti v podatkovno strukturo (std::map), ker so
različnih tipov.. Naredil sem zato, tako da macro FIELD poleg člana razreda kreira še
getter metodo, ki vrne FieldBase*... npr.. za personId, bi getter izgledal takole:
Sedaj pa lahko naredim podatkovno strukturo kazalcev na te funkcije (getterje) razreda...
Prednost tega je ta, da lahko mapiranje naredim statično in sedaj vsaka instanca ne vsebuje
svoje podatkovne strukture za mapiranje ampak se uporablja samo statična npr. Person::maps...
svojo mapo z mapiranimi imeni polj in kazalci na tip člana razreda...
std::map<std::string, FieldBase*>
Namesto običajnih kazalcev sem hotel uporabiti kazalce na člane razreda...
Field<int, FIELD_PRIMARY> Person::*pmi = Person::&personId; Field<std::string, FIELD_NOTNULL> Person::*pms = &Person::name;
Nastal je problem saj ne morem teh kazalcev spraviti v podatkovno strukturo (std::map), ker so
različnih tipov.. Naredil sem zato, tako da macro FIELD poleg člana razreda kreira še
getter metodo, ki vrne FieldBase*... npr.. za personId, bi getter izgledal takole:
class Person : public ActiveRecord<Person> { public: Field<int, FIELD_PRIMARY> personId; FieldBase* get_personId() { return static_cast<Bear::FieldBase*>(&personId); }
Sedaj pa lahko naredim podatkovno strukturo kazalcev na te funkcije (getterje) razreda...
typedef FieldBase* ( Person::*MemFun )(); typedef Dictionary<bstring, MemFun> FieldDict;
Prednost tega je ta, da lahko mapiranje naredim statično in sedaj vsaka instanca ne vsebuje
svoje podatkovne strukture za mapiranje ampak se uporablja samo statična npr. Person::maps...
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | napaka v c++Oddelek: Programiranje | 1899 (984) | čuhalev |
» | c++ two dimensional array v classuOddelek: Programiranje | 1397 (1200) | Senitel |
» | PHP in varnost.Oddelek: Programiranje | 3105 (2601) | krho |
» | mysql "hitrost"Oddelek: Izdelava spletišč | 1979 (1861) | Veron |
» | PHP ASPOddelek: Izdelava spletišč | 3020 (2345) | MrBrdo |