🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: alt.pl.comp.lang.csharp
6 messages
6 total messages Started by GrzybSon Wed, 03 Nov 2010 09:00
[NH] many-to-many i session.Save(movie)
#21822
Author: GrzybSon
Date: Wed, 03 Nov 2010 09:00
95 lines
4110 bytes
Witam,

a więc ciąg dalszy walki z NH nastapił i tak:

mam sobie klasę Film i Gatunek - u mnie jest to klasyczna relacja wiele do 
wielu:

<Film hbm>

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="nh.wypozyczalnia.Film,NH.Domain" table="film" lazy="true">
    <id name="Id" column="id" type="Decimal">
      <generator class="native" />
    </id>

    <property name="TytulPolski" column="tytul_polski" type="string" 
not-null="true" />
    <property name="TytulObcy" column="tytul_obcy" type="string" />
    <property name="DataPremiery" column="data_premiery" type="DateTime" />
    <property name="Uwagi" column="uwagi" type="string" />
    <property name="Okladka" column="okladka" type="string" />
    <many-to-one name="FormatFilmu" column="id_formatuFilmu" 
cascade="save-update" />
    <many-to-one name="RodzajTlumaczenia" column="id_rodzajuTlumaczenia" 
cascade="save-update" />
    <property name="Sciezka" column="sciezka" type="string" />

    <bag name="FilmAktor" inverse="true" lazy="true" cascade="all">
      <key column="id_filmu" />
      <one-to-many class="nh.wypozyczalnia.FilmAktor,NH.Domain" />
    </bag>

    <bag name="Gatunki" table="gatunki_filmow" inverse="true" 
cascade="save-update" generic="true">
      <key column="id_filmu" />
      <many-to-many class="nh.wypozyczalnia.Gatunek,NH.Domain" 
column="id_gatunku" />
    </bag>
  </class>
</hibernate-mapping>


<Gatunek.hbm>

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <!--Build: with lujan99@usa.net Nhibernate template-->
  <class name="nh.wypozyczalnia.Gatunek,NH.Domain" table="gatunek" 
lazy="true">
    <id name="Id" column="id" type="Decimal">
      <generator class="native" />
    </id>
    <property name="Nazwa" column="nazwa" type="string" not-null="true" />

    <bag name="Filmy" table="gatunki_filmow" cascade="save-update" 
generic="true">
      <key column="id_gatunku" />
      <many-to-many class="nh.wypozyczalnia.Film,NH.Domain" 
column="id_filmu" />
    </bag>
  </class>
</hibernate-mapping>

Teraz wypełniam sobie obiekt Film danymi (także listę gatunków związanych z 
filmem), ale tylko dane dotyczące samego filmu się zapisują do bazy,
a nie idą inserty związane z Gatunkami filmu.

Jak to obejść?

<kodzik zapisujący drzewko filmu>

GenericSingleton<DataProvider>.Instance.InTransaction(
                session =>
                {
                    movie.FormatFilmu = session.Load<FormatFilmu>(ff);
                    movie.RodzajTlumaczenia = 
session.Load<RodzajTlumaczenia>(tlumaczenie);

                    if (gatunki != null)
                    {
                        foreach (decimal idGatunku in gatunki)
                        {
                            movie.Gatunki.Add(session.Load<Gatunek>(idGatunku));
                        }
                    }

                    session.Save(movie);
                });

</kodzik zapisujący drzewko filmu>

--
Pozdro,
 Maćko 
Re: [NH] many-to-many i session.Save(movie)
#21823
Author: Łukasz 'Maly' Ostrowski
Date: Wed, 03 Nov 2010 14:57
53 lines
2821 bytes
On Wed, 3 Nov 2010 10:00:31 +0100, GrzybSon wrote:
> <Film hbm>
> 
> <?xml version="1.0" encoding="utf-8"?>
> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
>     <class name="nh.wypozyczalnia.Film,NH.Domain" table="film" lazy="true">
>     <id name="Id" column="id" type="Decimal">
>       <generator class="native" />
>     </id>
> 
>     <property name="TytulPolski" column="tytul_polski" type="string" 
> not-null="true" />
>     <property name="TytulObcy" column="tytul_obcy" type="string" />
>     <property name="DataPremiery" column="data_premiery" type="DateTime" />
>     <property name="Uwagi" column="uwagi" type="string" />
>     <property name="Okladka" column="okladka" type="string" />
>     <many-to-one name="FormatFilmu" column="id_formatuFilmu" 
> cascade="save-update" />
>     <many-to-one name="RodzajTlumaczenia" column="id_rodzajuTlumaczenia" 
> cascade="save-update" />
>     <property name="Sciezka" column="sciezka" type="string" />
> 
>     <bag name="FilmAktor" inverse="true" lazy="true" cascade="all">
>       <key column="id_filmu" />
>       <one-to-many class="nh.wypozyczalnia.FilmAktor,NH.Domain" />
>     </bag>
> 
>     <bag name="Gatunki" table="gatunki_filmow" inverse="true" 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> cascade="save-update" generic="true">
>       <key column="id_filmu" />
>       <many-to-many class="nh.wypozyczalnia.Gatunek,NH.Domain" 
> column="id_gatunku" />
>     </bag>
>   </class>
> </hibernate-mapping>

http://stackoverflow.com/questions/712802/nhibernate-many-to-many-relationship-not-working

Na szybko, Inverse na Filmie, a później dodawanie kategorii do
filmu nie zahula ;-).

Pozatym Many-to-Many wymusza na Tobie dodanie relacji
po obu stronach tejże, do Kategorii dodajesz film,
do filmu dodajesz kategorie.

Szerzej w poście na SO.

p.s. decimal jako typ klucza głównego to jest wybór świadomy? ;-)

-- 
Pozdrawiam,
Łukasz 'Maly' Ostrowski.      http://l3v.eu/
Re: [NH] many-to-many i session.Save(movie)
#21824
Author: GrzybSon
Date: Thu, 04 Nov 2010 08:17
80 lines
3865 bytes
> Na szybko, Inverse na Filmie, a później dodawanie kategorii do
> filmu nie zahula ;-).

Trochę poszperałem i doszedłem do mapowania, które u mnie działa:

dla filmu ->

// ------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <!--Build: with lujan99@usa.net Nhibernate template-->
  <class name="nh.wypozyczalnia.Film,NH.Domain" table="film" lazy="true">
    <id name="Id" column="id" type="Decimal">
      <generator class="native" />
    </id>
         ...
    <bag name="Gatunki" table="gatunki_filmow" cascade="all">
      <key column="id_filmu" />
      <many-to-many class="nh.wypozyczalnia.Gatunek,NH.Domain" 
column="id_gatunku" />
    </bag>
  </class>
</hibernate-mapping>
// ------------------------------------------------------------------------------------------------------------------



dla gatunku ->
// ------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <!--Build: with lujan99@usa.net Nhibernate template-->
  <class name="nh.wypozyczalnia.Gatunek,NH.Domain" table="gatunek" 
lazy="true">
    <id name="Id" column="id" type="Decimal">
      <generator class="native" />
    </id>

 ...

    <bag name="Filmy" table="gatunki_filmow" inverse="true">
      <key column="id_gatunku" />
      <many-to-many class="nh.wypozyczalnia.Film,NH.Domain" 
column="id_filmu" />
    </bag>
  </class>
</hibernate-mapping>
// ------------------------------------------------------------------------------------------------------------------

i teraz elegancko działa kodzik:

GenericSingleton<DataProvider>.Instance.InTransaction(
                session =>
                {
                    movie.FormatFilmu = session.Load<FormatFilmu>(ff);
                    movie.RodzajTlumaczenia = 
session.Load<RodzajTlumaczenia>(tlumaczenie);

                    if (gatunki != null)
                    {
                        Gatunek gatunek;
                        foreach (decimal idGatunku in gatunki)
                        {
                            movie.Gatunki.Add(session.Load<Gatunek>(idGatunku));
                        }
                    }

                    session.Save(movie);
                });

> p.s. decimal jako typ klucza głównego to jest wybór świadomy? ;-)

Wybór świadomy dla szablonu z MyGeneration :)
W bazie PK jest typu numeric(18,0) co jest rozpoznawane jako konwertowane do 
decimala w narządzie.
A czym być to zastąpił?

--
Pozdro,
 Maćko 
Re: [NH] many-to-many i session.Save(movie)
#21825
Author: Łukasz 'Maly' Ostrowski
Date: Thu, 04 Nov 2010 08:47
21 lines
1664 bytes
On Thu, 4 Nov 2010 09:17:23 +0100, GrzybSon wrote:
>> p.s. decimal jako typ klucza głównego to jest wybór świadomy? ;-)
> 
> Wybór świadomy dla szablonu z MyGeneration :)

Chyba umiejętność samodzielnego klepania .hbmów lub mapowań
via FluentNHibernate na przyszłość się przyda, as opposed to
korzystanie z generatorków ;-). IMO.

> W bazie PK jest typu numeric(18,0) co jest rozpoznawane jako konwertowane do 
> decimala w narządzie.
> A czym być to zastąpił?

int/long, IMO typy proste są łatwiejsze do zindeksowania,
porównania etc, etc. Pozatym sekwencje/identity operują
*chyba* wewnętrznie na int/longach. .NETowy decimal 
nie jest przesadnie "prosty" w porównaniu do int/long.

-- 
Pozdrawiam,
Łukasz 'Maly' Ostrowski.      http://l3v.eu/
Re: [NH] many-to-many i session.Save(movie)
#21826
Author: GrzybSon
Date: Thu, 04 Nov 2010 11:20
22 lines
1969 bytes
Użytkownik "Łukasz 'Maly' Ostrowski" <maly@USUNnemo.pl> napisał w wiadomości 
news:u9cnvg3isqnt.45tpsex5vqlf$.dlg@40tude.net...
> On Thu, 4 Nov 2010 09:17:23 +0100, GrzybSon wrote:
>>> p.s. decimal jako typ klucza głównego to jest wybór świadomy? ;-)
>>
>> Wybór świadomy dla szablonu z MyGeneration :)
>
> Chyba umiejętność samodzielnego klepania .hbmów lub mapowań
> via FluentNHibernate na przyszłość się przyda, as opposed to
> korzystanie z generatorków ;-). IMO.

Pewnie, że się przydaje (jak widać po poście). Dla mnie fluent jest po 
prostu jeszcze zbyt abstrakcyjny, bardziej przemawia do mnie mapowanie w 
postaci HBMa. A Ty model domenowy projektujesz po bożemu tzn. zaczynasz od 
modelu klas a VS, po czym generujesz bazę ze schemy czy tak jak ja?

A wogóle to wolisz EF czy NH?

--
Pozdro,
 Maćko 
Re: [NH] many-to-many i session.Save(movie)
#21827
Author: Łukasz 'Maly' Ostrowski
Date: Thu, 04 Nov 2010 12:58
20 lines
1746 bytes
On Thu, 4 Nov 2010 12:20:26 +0100, GrzybSon wrote:
> Pewnie, że się przydaje (jak widać po poście). Dla mnie fluent jest po 
> prostu jeszcze zbyt abstrakcyjny, bardziej przemawia do mnie mapowanie w 
> postaci HBMa. A Ty model domenowy projektujesz po bożemu tzn. zaczynasz od 
> modelu klas a VS, po czym generujesz bazę ze schemy czy tak jak ja?

Wyklepuje klasy jako model domenowy, dodaje mapowania, najwygodniej 
mi we Fluencie, a później puszczam generacje bazy z mapowań,
a na koniec weryfikuje co dostałem z tych mapowań ;-).

> A wogóle to wolisz EF czy NH?

NH, jest bardziej feature complete i mature, na chwile obecną
przyglądam się NH3.0 z QueryOver i LINQ to NH.

p.s. zostało decimal? =].

-- 
Pozdrawiam,
Łukasz 'Maly' Ostrowski.      http://l3v.eu/
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads