» »

[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č...

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.

zhigatsey ::

Žal ne gre za .Net ampak standarden c++...
Si bom ogledal hiberlite in dtl..

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
// 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...

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

napaka v c++

Oddelek: Programiranje
201903 (988) čuhalev
»

c++ two dimensional array v classu

Oddelek: Programiranje
111398 (1201) Senitel
»

PHP in varnost.

Oddelek: Programiranje
283109 (2605) krho
»

mysql "hitrost"

Oddelek: Izdelava spletišč
91979 (1861) Veron
»

PHP ASP

Oddelek: Izdelava spletišč
353024 (2349) MrBrdo

Več podobnih tem