• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    BUTHRAKAURObject Relational Mapping :: rady, tipy, triky
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    GOSHEWAN: porad uplne nechapu, jak presne ty tridy vypadaj a jak vypada to DB schema, ale obyc dictionary se da namapovat treba nejak takhle:

    HasMany(x => x.Dict)
    .Table("TableX")
    .DictionaryKey("keyColumn")
    .DictionaryValue("valueColumn");
    GOSHEWAN
    GOSHEWAN --- ---
    Reference na entitu by tam byt mela, ale neni a ja to neovlivnim /-:

    Obecne potrebuju postup jak rict, cim ma naplnit ten slovnik a jak rict, ze to ma byt i z jine tabulky.
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    GOSHEWAN: asi uplne nechapu, co je to "Local ID" vs "Global ID", ale prijde mi to nejaky zbesily - nemely by tam byt spis reference na entitu A/B/C? mozna by pomohlo, kdybys ukazal aspon trochu kodu... takhle podle popisu mi to prijde nejak podezrele neOO, ale to se mozna jen pletu :)

    jinak prikladu na mapovani Dictionary pres (F)NH je na stackoverflow apod celkem hodne, ale nevim, jak moc jsou pouzitelny v tomhle pripade...
    GOSHEWAN
    GOSHEWAN --- ---
    Ahoj,

    byl jsem postaven pred problem napasovani jedne konstrukce do (Fluent) NHibernate. Nikdy jsem s tim nedelal a uvitam jakykoli hint:

    Mam Entitu A, ktera drzi IDictionary<int, double> s tim, ze key je "Local ID", double nejaka pridruzena hodnota.
    Dalsi entita B ma "Global ID" (unique) a "Local ID" (muze se opakovat).
    Posledni entita C predstavuje mapovani mezi prvni a druhou vcetne te pridruzene double hodnoty, tzn. ma "Global ID 1", "Global ID 2", "value".

    Napada vas nejaky zpusob, jak to namapovat? Pokud to chapu spravne, tak potrebuju nejaky "mezidotaz" pri plneni toho IDictionary. Rict "napln IDictionary v A tak, ze se podivas do DB na entitu C a vyberes jen ty, kde GlobalID1 == A.ID. Vezmi "result.GlobalID2" a "result.value". Prvni pouzij, abys nasel v entitach B jeji LocalID a timhle pak napln ten slovnik".
    Validitu mapovani mam zajistenou jinde (jinymi slovy - vysledne LocalIDs budou pro danou entitu A unikatni (tzn. budou pro ni lokalni ID)).

    Tzn. jak mu vnutim
    a) kombinace dotazu na jine tabulky
    b) co ma pouzit jako klic a co jako hodnotu v tom slovniku
    SWITCHMAN
    SWITCHMAN --- ---
    ocividne ne .)
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    JIMMYJAMES: enum by melo jit namapovat pomoci vlastni implementace IUserType. pokud ale nechces udrzovat ty prvky enum na 2 mistech a pokud chces v DB osetrit integritu, tak ti asi nezbyde nez vyrobit na ty role tabulku a v aplikaci v DB vrstve potom nekde implementovat neco jako GetReziserRole() apod..
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    JIMMYJAMES: Hibernate neznam, ale ten enum by urcite sel predelat na tabulku, ne? Ta by pak mela vychozi obsah (reziser, herece, osvetlovac, atd...).
    JIMMYJAMES
    JIMMYJAMES --- ---
    Zdravím,
    neví někdo jak na ternární asociaci v Hibernate/JPA (používám anotace)?

    Mám tuto situaci; eviduju filmy a u nich lidi, kteří se podíleli na jeho tvorbě (tzn. režiséři, scénáristi, herci... nazývám jako "role"). Každý film může mít více lidí stejné role, každý člověk může mít více rolí, každý člověk může být u více filmů.

    V databázi to vypadá takto:
    Movie (MOVIE_ID, released, runtime, ...);
    People (PEOPLE_ID, name, ...);
    Movie_people (MOVIE_ID, PEOPLE_ID, role); UNIQUE (MOVIE_ID, PEOPLE_ID, role);

    Role je v Hibernate jako Enum. (Nevím, jak synchronizovat Enum v aplikaci s číselníkovou tabulkou či enumem v DB (a nehci to definovat zvlášť na dvou místech), takže momentálně to mám tak, že role je v DB jen číselná hodnota, není FK. Mimochodem, kdyby někdo znal lepší řešení, tak určitě vítám, z databázového pohledu se mi tohle nelíbí.)

    Chtěl bych to namapovat nějak takto:
    Map<Role, Set<People>> people

    Role je Enum type, People doménová třída (@Entity).

    Cílem je, abych mohl jednoduše zavolat:
    Collection<People> getPeople(Role role);
    addPeople(Role role, Collection<People> people);

    Už jsem strávil několik hodin hledání, našel jsem i stejný problém v několika diskuzích, ale nikdo to nedokázal vyřešit (ale zatím nikdo nevyloučil, by to nešlo...).
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    NHLambdaExtensions
    A project that provides extension methods for the NHibernate ICriteria interface to allow use of typesafe lambda expressions.

    e.g.,

    .Add(Expression.Eq("Name", "Smith"))

    becomes

    .Add<Person>(p => p.Name == "Smith")
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    Fluent NHibernate - Fluent, XML-less, compile safe, automated, testable mappings for NHibernate. sikovna vec...
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    JENIIK: ale klidne komentuj - rad se dovzdelam... asi ti vlastne vadi to, ze ten ORM nespusti "update x set value = value + 10 where id in (1,2,3)", ale misto pusti 3 updaty samostatne, co? ale to mi pri odpojenejch datech (jak uz asi naznacoval TENCOKACI) bez dlouhyho pesimistickyho zamykani neprijde zrovna na skodu... bez zamku by to s tim jednim hromadnym updatem mohlo mit celkem neblahy dusledky :)
    ale sem dneska uz trochu mimo, tak je mozny, ze sem neco zcela zasadniho prehlid .)
    JENIIK
    JENIIK --- ---
    BUTHRAKAUR: To asi nemá cenu komentovat...
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    JENIIK: nevim ted, co presne ti prijde nenormalni :) ty updaty se odeslou hromadne az pri flushnuti session v jedny davce, takze by v tom nemel bejt zadnej vykonnostni problem....
    JENIIK
    JENIIK --- ---
    to jsem moc nepochopil, snad večer se k tomu budu moci vrátit...
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    JENIIK: jj, to taky pouzivame. ale uklada se to spolecne s tim jednim zaznamem v transakci.

    model: uzivatel na polozce dokladu zmeni produkt. po zmene hodnoty v zaznamu polozky se nactou urcite vlastnosti produktu ( podle nejakeho pravidla ) a vytvori se podle nich vlastnosti polozky. pri ukladani zaznamu se pak ulozi do svazane tabulky s vlastnostmi polozky nove zaznamy.

    takze vysledek je nejaky takovyto (zjednodusene):
    UPDATE tblDokladyPolozkaProdukt SET IDProdukt = 'aeb32810-04f7-4516-80fa-8f63d783c885'
    DELETE tblDokladyPolozkaVlastnost WHERE IDPolozka = '91a41310-58ea-49b1-be5d-64270f11abbe'
    INSERT INTO tblDokladyPolozkyVlastnist ( VlastnostID, IDPolozka, IDDruhVlastnosti, Vlastnosti ) VALUES ( ............. )


    Takhle se to normalne dela, pokud mas scenar s "odpojenymi daty". Kdyz to spravne implementujes tak, mas jistotu ze se ti bud ulozi vsechno nebo nic.
    JENIIK
    JENIIK --- ---
    TENCOKACISTROMY: no to jo, ale to, co jsem viděl dole mělo simulovat mlj trigger a to dost nešťastně. Totiž změnou jednoho záznamu můžeš změnit X záznamů ve statistických tabulkách...
    Kliknutím sem můžete změnit nastavení reklam