🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.java
25 messages
25 total messages Started by mk Thu, 08 Jan 2009 09:46
hibernate mapowanie kluczy obcych xml
#143561
Author: mk
Date: Thu, 08 Jan 2009 09:46
35 lines
1493 bytes
Witam

Mam pewien kłopot z mapowaniem w hibernate. Są trzy tabele:

[Osoba]
id
Nazwisko
(...)

[Lista]
id
nazwa
uwagi

[Listy]
id
fk_id_osoba
fk_id_lista

Czyli tabela [Listy] przechowuje id tabeli Lista i id tabeli Osoba jako 
klucze obce.
Jest to potrzebne do przechowywania List Osób, przy czym jedna osoba 
może być na wielu listach.

Nie bardzo wiem jak zamapować taką sytuację w listy.hbm.xml aby 
dodatkowo uwzględnić kaskadowość.
Czyli jak usunę osobę, to rzeby hibernate usunął wpisy dotyczące tej 
osoby w tabeli Listy oraz jak usunę Listę lub zmodyfikuję, to również 
odpowiednio zareagował.

Jak to powinno poprawnie być zrobione?

dzięki
pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143562
Author: mk
Date: Thu, 08 Jan 2009 10:29
38 lines
1830 bytes
mk pisze:
> Witam
(...)
> Nie bardzo wiem jak zamapować taką sytuację w listy.hbm.xml aby 
> dodatkowo uwzględnić kaskadowość.
> Czyli jak usunę osobę, to rzeby hibernate usunął wpisy dotyczące tej 
> osoby w tabeli Listy oraz jak usunę Listę lub zmodyfikuję, to również 
> odpowiednio zareagował.
> 
> Jak to powinno poprawnie być zrobione?
> 
> dzięki
> pozdr.
> mk

Zrobiłem coś takiego:

  <class name="Listy" table="listy">
     <id name="id">
       <generator class="native"/>
     </id>
    <many-to-one name="id_adr"
    column="id_adr"
    class="Adresaci"
    not-null="true"
    cascade="all"/>
    <many-to-one name="id_lista"
    column="id_lista"
    class="Lista"
    not-null="true"
    cascade="all"/>
    </class>

Jak myślicie, jest ok? Od strony bazy wygląda dobrze ale uczę się 
dopiero i pewności nie mam.

pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143563
Author: Jarek
Date: Thu, 08 Jan 2009 23:43
31 lines
1460 bytes
"mk" <mk@mk.pl> wrote in message 
news:gk4i5e$hou$1@atlantis.news.neostrada.pl...
> Witam
>
> Mam pewien kłopot z mapowaniem w hibernate. Są trzy tabele:
>
> [Osoba]
> id
> Nazwisko
> (...)
>
> [Lista]
> id
> nazwa
> uwagi
>
> [Listy]
> id
> fk_id_osoba
> fk_id_lista
>

A po co ci dodatkowe id w tabeli Listy? Kluczem główny mógłby być złożony z 
kolumn fk_id_osoba i fk_id_lista.

Wtedy zamapowałbyś sobie to w hibernate jako zwykłą relację many-to-many - 
nie byłoby encji odpowiadającej tabeli Listy.

Pozdrawiam
Jarek
 
Re: hibernate mapowanie kluczy obcych xml
#143564
Author: mk
Date: Fri, 09 Jan 2009 14:17
32 lines
1536 bytes
Jarek pisze:

> A po co ci dodatkowe id w tabeli Listy? Kluczem główny mógłby być 
> złożony z kolumn fk_id_osoba i fk_id_lista.
> 

Potrzebny po to, że zakładam możliwość wystąpienia tej samej osoby kilka 
razy na tej samej liście. Jest taka uzasadniona potrzeba.

Czyli np.

[Listy]
id fk_id_osoba fk_id_lista
1 	1	 1
2 	1	 1
3 	1	 2
4	1	 7
5 	1	 1
6 	2 	 2
7 	2 	 3
8 	2 	 2
itp.


> Wtedy zamapowałbyś sobie to w hibernate jako zwykłą relację many-to-many 
> - nie byłoby encji odpowiadającej tabeli Listy.
> 
> Pozdrawiam
> Jarek
> 
pozdr
mk
Re: hibernate mapowanie kluczy obcych xml
#143566
Author: mk
Date: Fri, 09 Jan 2009 18:22
38 lines
1670 bytes
Jarek pisze:
> "mk" <mk@mk.pl> wrote in message 
> news:gk4i5e$hou$1@atlantis.news.neostrada.pl...
>> Witam
>>
>> Mam pewien kłopot z mapowaniem w hibernate. Są trzy tabele:
>>
>> [Osoba]
>> id
>> Nazwisko
>> (...)
>>
>> [Lista]
>> id
>> nazwa
>> uwagi
>>
>> [Listy]
>> id
>> fk_id_osoba
>> fk_id_lista
>>
> 
> A po co ci dodatkowe id w tabeli Listy? Kluczem główny mógłby być 
> złożony z kolumn fk_id_osoba i fk_id_lista.
> 
> Wtedy zamapowałbyś sobie to w hibernate jako zwykłą relację many-to-many 
> - nie byłoby encji odpowiadającej tabeli Listy.

a mógłbyś podać takie mapowanie, byłbym bardzo wdzięczny.

> 
> Pozdrawiam
> Jarek

dzięki
pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143565
Author: Jarek
Date: Fri, 09 Jan 2009 18:59
39 lines
1847 bytes
Jakoś tak:

<class name="jakis.pakiet.Lista" table="lista">
...
		<set name="osoby" table="listy" lazy="true"
			cascade="all">

			<key column="fk_id_lista"></key>

			<many-to-many class="jakis.pakiet.Osoba"
				column="fk_id_osoba" outer-join="auto" />

		</set>
...
</class>

i  drugiej strony

<class name="jakis.pakiet.Osoba" table="osoba">
...
		<set name="listy" table="listy" lazy="true" inverse="true"
			cascade="all">

			<key column="fk_id_osoba"></key>

			<many-to-many class="jakis.pakiet.Lista"
				column="fk_id_lista" outer-join="auto" />

		</set>
...
</class>

Ale do nauki zdecydowanie polecam mapowanie za pomocą adnotacji. Jest dużo 
bardziej przejrzyste i trudniej się pomylić.
Xml jest czasem przydatny do nadpisywania mapowania zrobionego na 
adnotacjach, np. przy deploymencie w innym środowisku.

Pozdrawiam
Jarek 
Re: hibernate mapowanie kluczy obcych xml
#143567
Author: mk
Date: Fri, 09 Jan 2009 19:29
146 lines
4431 bytes
Jarek pisze:
> Jakoś tak:
> 
> <class name="jakis.pakiet.Lista" table="lista">
> ...
>         <set name="osoby" table="listy" lazy="true"
>             cascade="all">
> 
>             <key column="fk_id_lista"></key>
> 
>             <many-to-many class="jakis.pakiet.Osoba"
>                 column="fk_id_osoba" outer-join="auto" />
> 
>         </set>
> ...
> </class>
> 
> i  drugiej strony
> 
> <class name="jakis.pakiet.Osoba" table="osoba">
> ...
>         <set name="listy" table="listy" lazy="true" inverse="true"
>             cascade="all">
> 
>             <key column="fk_id_osoba"></key>
> 
>             <many-to-many class="jakis.pakiet.Lista"
>                 column="fk_id_lista" outer-join="auto" />
> 
>         </set>
> ...
> </class>
> 
> Ale do nauki zdecydowanie polecam mapowanie za pomocą adnotacji. Jest 
> dużo bardziej przejrzyste i trudniej się pomylić.
> Xml jest czasem przydatny do nadpisywania mapowania zrobionego na 
> adnotacjach, np. przy deploymencie w innym środowisku.
> 
> Pozdrawiam
> Jarek

Dzięki, zaczynam rozumieć. Hibernate na podstawie tego zrobi mi tabelę 
łączącą (join) przechowującą te klucze obce, czy tak?

Jakoś dodakowo trzeba to uwzględnić w klasach Osoba i Lista gdzie mam 
get i set-ery?

Aktualnie mam:
public final class Osoba {

     private int id;
     private String przedrostek;
     private String nazwa_os;
     private String nazwa_ins;
     private String kod;
     private String poczta;
     private String ulica;
     private String przyrostek;

     public int getId(){
         return id;
     }

     public void setId(int id){
         this.id=id;
     }

     public String getPrzedrostek(){
         return przedrostek;
     }
     public void setPrzedrostek(String przedrostek){
         this.przedrostek=przedrostek;
     }
     public String getNazwa_os(){
         return nazwa_os;
     }
     public void setNazwa_os(String nazwa_os){
         this.nazwa_os=nazwa_os;
     }
    public String getNazwa_ins(){
         return nazwa_ins;
     }
     public void setNazwa_ins(String nazwa_ins){
         this.nazwa_ins=nazwa_ins;
     }
     public String getKod(){
         return kod;
     }
     public void setKod(String kod){
         this.kod=kod;
     }
     public String getPoczta(){
         return poczta;
     }
     public void setPoczta(String poczta){
         this.poczta=poczta;
     }
     public String getUlica(){
         return ulica;
     }
     public void setUlica(String ulica){
         this.ulica=ulica;
     }
     public String getPrzyrostek(){
         return przyrostek;
     }
     public void setPrzyrostek(String przyrostek){
         this.przyrostek=przyrostek;
     }
}

oraz

public final class Lista {

     private int id;
     private String nazwa;
     private String uwagi;
     public int getId(){
         return id;
     }

     public void setId(int id){
         this.id=id;
     }
     public String getNazwa(){
         return nazwa;
     }
     public void setNazwa(String nazwa){
         this.nazwa=nazwa;
     }

    public String getUwagi(){
         return uwagi;
     }
     public void setUwagi(String uwagi){
         this.uwagi=uwagi;
     }

}

Rozumiem, że zbędna jest klasa Listy z get i set-erami?

dzięki
pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143568
Author: Jarek
Date: Fri, 09 Jan 2009 20:09
123 lines
3873 bytes
"mk" <mk@mk.pl> wrote in message 
news:gk892b$pi2$1@nemesis.news.neostrada.pl...
>
> Dzięki, zaczynam rozumieć. Hibernate na podstawie tego zrobi mi tabelę 
> łączącą (join) przechowującą te klucze obce, czy tak?
>
> Jakoś dodakowo trzeba to uwzględnić w klasach Osoba i Lista gdzie mam get 
> i set-ery?
>
> Aktualnie mam:
> public final class Osoba {
>
>     private int id;
>     private String przedrostek;
>     private String nazwa_os;
>     private String nazwa_ins;
>     private String kod;
>     private String poczta;
>     private String ulica;
>     private String przyrostek;
>
>     public int getId(){
>         return id;
>     }
>
>     public void setId(int id){
>         this.id=id;
>     }
>
>     public String getPrzedrostek(){
>         return przedrostek;
>     }
>     public void setPrzedrostek(String przedrostek){
>         this.przedrostek=przedrostek;
>     }
>     public String getNazwa_os(){
>         return nazwa_os;
>     }
>     public void setNazwa_os(String nazwa_os){
>         this.nazwa_os=nazwa_os;
>     }
>    public String getNazwa_ins(){
>         return nazwa_ins;
>     }
>     public void setNazwa_ins(String nazwa_ins){
>         this.nazwa_ins=nazwa_ins;
>     }
>     public String getKod(){
>         return kod;
>     }
>     public void setKod(String kod){
>         this.kod=kod;
>     }
>     public String getPoczta(){
>         return poczta;
>     }
>     public void setPoczta(String poczta){
>         this.poczta=poczta;
>     }
>     public String getUlica(){
>         return ulica;
>     }
>     public void setUlica(String ulica){
>         this.ulica=ulica;
>     }
>     public String getPrzyrostek(){
>         return przyrostek;
>     }
>     public void setPrzyrostek(String przyrostek){
>         this.przyrostek=przyrostek;
>     }
> }
>
> oraz
>
> public final class Lista {
>
>     private int id;
>     private String nazwa;
>     private String uwagi;
>     public int getId(){
>         return id;
>     }
>
>     public void setId(int id){
>         this.id=id;
>     }
>     public String getNazwa(){
>         return nazwa;
>     }
>     public void setNazwa(String nazwa){
>         this.nazwa=nazwa;
>     }
>
>    public String getUwagi(){
>         return uwagi;
>     }
>     public void setUwagi(String uwagi){
>         this.uwagi=uwagi;
>     }
>
> }
>
> Rozumiem, że zbędna jest klasa Listy z get i set-erami?
>
> dzięki
> pozdr.
> mk

Tak, klasa Listy będzie zbędna.
A do klas Osoba i Lista musisz dodać odpowiednio pola (najlepiej od razu 
zainicjalizowane):

Set<Lista> listy = new HashSet<Lista>();

oraz

Set<Osoba> osoby = new HashSet<Osoba>();

no i odpowiednie gettery i settery.

Pozdrawiam
Jarek 
Re: hibernate mapowanie kluczy obcych xml
#143569
Author: Jarek
Date: Fri, 09 Jan 2009 20:16
11 lines
1588 bytes
A jeśli zależy Ci na tym, żeby jedna osoba mogła się znajdować na danej 
liście kilka razy (no i daną listę mieć kilka razy w kolekcji list) to w obu 
klasach zamiast zbiorów zrób listy, a mapowanie wykonaj jako idbag opisany 
tutaj (punkt 6.3.5):
http://www.hibernate.org/hib_docs/reference/en/html/collections-advancedmappings.html#collections-idbag

wtedy w tej łączące tabelce "Listy" będziesz miał dodatkową kolumnę id, tak 
jak to miałeś w tabelkach w pierwszym poscie.

Pozdrawiam
Jarek 
Re: hibernate mapowanie kluczy obcych xml
#143570
Author: mk
Date: Sat, 10 Jan 2009 10:12
69 lines
2490 bytes
Jarek pisze:

> Tak, klasa Listy będzie zbędna.
> A do klas Osoba i Lista musisz dodać odpowiednio pola (najlepiej od razu 
> zainicjalizowane):
> 
> Set<Lista> listy = new HashSet<Lista>();
> 
> oraz
> 
> Set<Osoba> osoby = new HashSet<Osoba>();
> 
> no i odpowiednie gettery i settery.
> 
> Pozdrawiam
> Jarek

Zdecydowałem się ostatecznie, na takie coś:

[osoby.hbm.xml]
     <set name="listy" table="listy" cascade="all">
         <key column="id_os"/>
         <many-to-many column="id" class="Lista"/>
         </set>

[Osoby.java]

    private Set listy;


   public Set getListy(){
         return this.listy;
     }
     public void setListy(Set listy){
         this.listy=listy;
     }

[lista.hbm.xml]
<set name="osoby" table="listy">
         <key column="id_lista"/>
         <many-to-many column="id" class="Osoby"/>
         </set>

[Lista.java]

  private Set osoby;

public Set getOsoby(){
         return this.osoby;
     }
     public void setOsoby(Set osoby){
         this.osoby=osoby;
     }

I ładnie tworzy mi tabelkę łączącą

[listy]
id_os
id
id_lista

Wydaje mi się, że jest ok, mógłbyś zerknąć czy czegoś nie przegapiłem?

Teraz będę chciał wpisać kilka osób na listę, jak to powinno się zrobić, 
coś kojarzę batch processing w hibernate, to tym tropem szukać?

dzięki
pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143571
Author: Jarek
Date: Sat, 10 Jan 2009 15:39
15 lines
1605 bytes
Po jednej stronie musisz dodać inverse="true"m np.:

<set name="listy" table="listy" lazy="true" inverse="true"
cascade="all">

W zasadzie wszystko jedno po której stronie to będzie.

Dodawanie osób do listy wygląda po prostu tak, że osobie do zbioru jej list 
dodajesz wybraną listę, a w tej liście do zbioru osób dodajesz osobę.
Przy masowych operacjach może się przydać to:
http://www.hibernate.org/hib_docs/reference/en/html/batch-direct.html

Pozdrawiam
Jarek
 
Re: hibernate mapowanie kluczy obcych xml
#143572
Author: mk
Date: Sat, 10 Jan 2009 16:05
37 lines
2467 bytes
Jarek pisze:
> Po jednej stronie musisz dodać inverse="true"m np.:
> 
> <set name="listy" table="listy" lazy="true" inverse="true"
> cascade="all">

dopisałem

> W zasadzie wszystko jedno po której stronie to będzie.
> 
> Dodawanie osób do listy wygląda po prostu tak, że osobie do zbioru jej 
> list dodajesz wybraną listę, a w tej liście do zbioru osób dodajesz osobę.

Zaraz, to nie wiem czy dobrze zrobiłem albo może nie do końca Cię rozumiem.
Idea jest taka, że mam listę osób, która jakoś się nazywa, jej nazwa 
oraz klucz główny przechowywany jest w tabeli Lista.
Mam też osoby opisane odpowiednimi polami w tabeli Osoby.

Teraz chciałbym wykonać operację, która jednocześnie:
1. Dodałaby nową listę o nazwie np. Testowa, czyli insert do tabeli Lista.
2. Do tej listy dodałaby wybrane osoby już istniejące w bazie, czyli 
insert kluczy do tabeli łączącej Listy.

Mógłbyś napisać jakiś przykładowy kod, który by to zrobił.
Przepraszam, że tak męczę ale naprawdę czytam już różne przykłady i 
coraz bardziej mi się miesza.

> Przy masowych operacjach może się przydać to:
> http://www.hibernate.org/hib_docs/reference/en/html/batch-direct.html
> 
> Pozdrawiam
> Jarek
> 
dzięki za pomoc i wyrozumiałość

pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143573
Author: mk
Date: Sat, 10 Jan 2009 17:10
38 lines
2338 bytes
Jarek pisze:
> Po jednej stronie musisz dodać inverse="true"m np.:
> 
> <set name="listy" table="listy" lazy="true" inverse="true"
> cascade="all">
> 
> W zasadzie wszystko jedno po której stronie to będzie.
> 
> Dodawanie osób do listy wygląda po prostu tak, że osobie do zbioru jej 
> list dodajesz wybraną listę, a w tej liście do zbioru osób dodajesz osobę.
> Przy masowych operacjach może się przydać to:
> http://www.hibernate.org/hib_docs/reference/en/html/batch-direct.html
> 
> Pozdrawiam
> Jarek

Takie coś dodaje mi listę (aktywowane z przycisku):

Session session=factory.openSession();
        Transaction tx=session.beginTransaction();
        Lista list = new Lista();
        list.setNazwa(jTextField7.getText());
        list.setUwagi(jTextField5.getText());
         session.save(list);
	tx.commit();
         session.close();
         dispose();
Jak teraz w tej samej operacji dodać osoby do właśnie tworzonej listy?

Osoby istnieją już w bazie, więc chodzi tylko o wskazanie, które z nich 
wrzucam do tworzonej listy (pewnie po id).
Jakiś for?

I jak dobrze rozumiem ten związek zapisze się w tabeli Listy?

dzięki
pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143574
Author: Jarek
Date: Sun, 11 Jan 2009 12:54
48 lines
2435 bytes

"mk" <mk@mk.pl> wrote in message 
news:gkakui$pgh$1@atlantis.news.neostrada.pl...
>
> Takie coś dodaje mi listę (aktywowane z przycisku):
>
> Session session=factory.openSession();
>        Transaction tx=session.beginTransaction();
>        Lista list = new Lista();
>        list.setNazwa(jTextField7.getText());
>        list.setUwagi(jTextField5.getText());
>         session.save(list);
> tx.commit();
>         session.close();
>         dispose();
> Jak teraz w tej samej operacji dodać osoby do właśnie tworzonej listy?
>
> Osoby istnieją już w bazie, więc chodzi tylko o wskazanie, które z nich 
> wrzucam do tworzonej listy (pewnie po id).
> Jakiś for?
>
> I jak dobrze rozumiem ten związek zapisze się w tabeli Listy?
>

Na przykład tak:

Session session=factory.openSession();
Transaction tx=session.beginTransaction();
Lista list = new Lista();
list.setNazwa(jTextField7.getText());
list.setUwagi(jTextField5.getText());
session.save(list);

List<Osoba> osoby = session.createQuery("select o from Osoba o where JAKIS 
WARUNEK").getResultList();

for (Osoba o : osoby) {
    list.getOsoby().add(o);
    o.getListy().add(list);
}

tx.commit();
session.close();


Pozdrawiam
Jarek 
Re: hibernate mapowanie kluczy obcych xml
#143575
Author: mk
Date: Sun, 11 Jan 2009 22:29
30 lines
1834 bytes
Jarek pisze:

> Na przykład tak:
> 
> Session session=factory.openSession();
> Transaction tx=session.beginTransaction();
> Lista list = new Lista();
> list.setNazwa(jTextField7.getText());
> list.setUwagi(jTextField5.getText());
> session.save(list);
> 
> List<Osoba> osoby = session.createQuery("select o from Osoba o where 
> JAKIS WARUNEK").getResultList();
> 
> for (Osoba o : osoby) {
>    list.getOsoby().add(o);
>    o.getListy().add(list);
> }
> 
> tx.commit();
> session.close();
> 
> 
> Pozdrawiam
> Jarek

Działa aż miło, wielkie dzięki.

pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143576
Author: mk
Date: Mon, 12 Jan 2009 17:58
44 lines
2310 bytes
mk pisze:
> Jarek pisze:
> 
>> Na przykład tak:
>>
>> Session session=factory.openSession();
>> Transaction tx=session.beginTransaction();
>> Lista list = new Lista();
>> list.setNazwa(jTextField7.getText());
>> list.setUwagi(jTextField5.getText());
>> session.save(list);
>>
>> List<Osoba> osoby = session.createQuery("select o from Osoba o where 
>> JAKIS WARUNEK").getResultList();
>>
>> for (Osoba o : osoby) {
>>    list.getOsoby().add(o);
>>    o.getListy().add(list);
>> }
>>
>> tx.commit();
>> session.close();
>>
>>
>> Pozdrawiam
>> Jarek
> 
> Działa aż miło, wielkie dzięki.
> 
> pozdr.
> mk
Jeszcze mam jeden problem :)
Nie działa mi kaskadowe usuwanie. Tzn jak mam listę do ktorej przypisani 
są adresaci i chcę usunąc listę, to nie pozwala:

SEVERE: BŁĄD: update or delete on table "lista" violates foreign key 
constraint "fk623639b6f4a8341" on table "listy"
   Szczegóły: Key (id)=(105) is still referenced from table "listy".

możesz pomóc
dzięki

pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143577
Author: Jarek
Date: Mon, 12 Jan 2009 21:09
47 lines
2870 bytes
Witam,

To w zasadzie powinno działać.
Ale tak patrzę w ostatnie mapowanie, które wypisałeś, i ono nie jest jednak 
poprawne:

[osoby.hbm.xml]
     <set name="listy" table="listy" cascade="all">
         <key column="id_os"/>
         <many-to-many column="id" class="Lista"/>
                              ^^^^^
         </set>

[lista.hbm.xml]
<set name="osoby" table="listy">
         <key column="id_lista"/>
         <many-to-many column="id" class="Osoby"/>
                              ^^^^^
         </set>

Powinno być tak:

[osoby.hbm.xml]
     <set name="listy" table="listy" cascade="all" inverse="true">
         <key column="id_os"/>
         <many-to-many column="id_lista" class="Lista"/>
                              ^^^^^^^^^^
         </set>

[lista.hbm.xml]
<set name="osoby" table="listy">
         <key column="id_lista"/>
         <many-to-many column="id_os" class="Osoby"/>
                              ^^^^^^^
         </set>

I raczej wywal w ogóle kaskadowość bo kaskadowość działa w inny sposób niż 
potrzebujesz. Kaskadowość na kolekcji osób w liście oznaczałaby przy 
usuwaniu listy tyle, że należy też usunąć obiekty znajdujące się w liście 
czyli wszystkie osoby (czyli usunąłby osoby z bazy, a nie tylko z listy), a 
nie o to Ci raczej chodzi. Z tego co rozumiem to chodzi Ci tylko o to żeby 
usuwając listę usunęły się tylko powiązania z osobami, tak?
Jeśli nie zadziała, to spróbuj jeszcze przenieść inverse na drugą stronę.

Pozdrawiam
Jarek
 
Re: hibernate mapowanie kluczy obcych xml
#143578
Author: mk
Date: Mon, 12 Jan 2009 22:21
37 lines
2583 bytes
Jarek pisze:
> Witam,
> 
> To w zasadzie powinno działać.
> Ale tak patrzę w ostatnie mapowanie, które wypisałeś, i ono nie jest 
> jednak poprawne:

poprawiłem, dzięĸi

> I raczej wywal w ogóle kaskadowość bo kaskadowość działa w inny sposób 
> niż potrzebujesz. Kaskadowość na kolekcji osób w liście oznaczałaby przy 
> usuwaniu listy tyle, że należy też usunąć obiekty znajdujące się w 
> liście czyli wszystkie osoby (czyli usunąłby osoby z bazy, a nie tylko z 
> listy), a nie o to Ci raczej chodzi. Z tego co rozumiem to chodzi Ci 
> tylko o to żeby usuwając listę usunęły się tylko powiązania z osobami, tak?

Dokładnie tak.

> Jeśli nie zadziała, to spróbuj jeszcze przenieść inverse na drugą stronę.

próbowałem

nadal błąd:

update or delete on table "lista" violates foreign key constraint 
"fk623639b6f4a8341" on table "listy"
   Szczegóły: Key (id)=(108) is still referenced from table "listy".

Tak sobie myślę, że pewnie źle się za usuwanie biorę.
Robię tak:
Query q = s.createQuery("delete from Lista where 
id="+jTable1.getValueAt(jTable1.getSelectedRow(),0 ));
    q.executeUpdate();
    tx.commit();

pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143579
Author: Jarek
Date: Mon, 12 Jan 2009 23:45
26 lines
1901 bytes
>
> Tak sobie myślę, że pewnie źle się za usuwanie biorę.
> Robię tak:
> Query q = s.createQuery("delete from Lista where 
> id="+jTable1.getValueAt(jTable1.getSelectedRow(),0 ));
>    q.executeUpdate();
>    tx.commit();
>

No tak to raczej z automatu nie zadziała.
Spróbuj raczej:

Lista l = new Lista();
l.setId(idDoUsuniecia);
session.delete(l);
tx.commit();

a jak to nie zadziala to moze:

Lista l = session.get(Lista.class, idDoUsuniecia);
session.delete(l);
tx.commit();

Pozdrawiam
Jarek
 
Re: hibernate mapowanie kluczy obcych xml
#143580
Author: mk
Date: Tue, 13 Jan 2009 06:35
45 lines
2729 bytes
Jarek pisze:

> No tak to raczej z automatu nie zadziała.
> Spróbuj raczej:
> 
> Lista l = new Lista();
> l.setId(idDoUsuniecia);
> session.delete(l);
> tx.commit();

tu dostaje wyjątek:

Exception in thread "AWT-EventQueue-0" 
org.hibernate.PropertyValueException: not-null property references a 
null or transient value: kopertownik.Lista.nazwa


> a jak to nie zadziala to moze:
> 
> Lista l = session.get(Lista.class, idDoUsuniecia);
> session.delete(l);
> tx.commit();

tu też:

009-01-13 07:34:41 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: null
2009-01-13 07:34:41 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Zadanie wsadowe 0 delete from lista where id=108 zostało 
przerwane. Wywołaj getNextException by poznać przyczynę.
2009-01-13 07:34:41 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: 23503
2009-01-13 07:34:41 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: BŁĄD: update or delete on table "lista" violates foreign key 
constraint "fk623639b6f4a8341" on table "listy"
   Szczegóły: Key (id)=(108) is still referenced from table "listy".

> 
> Pozdrawiam
> Jarek
> 
> 

pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143581
Author: mk
Date: Tue, 13 Jan 2009 16:18
62 lines
3162 bytes
mk pisze:
> Jarek pisze:
> 
>> No tak to raczej z automatu nie zadziała.
>> Spróbuj raczej:
>>
>> Lista l = new Lista();
>> l.setId(idDoUsuniecia);
>> session.delete(l);
>> tx.commit();
> 
> tu dostaje wyjątek:
> 
> Exception in thread "AWT-EventQueue-0" 
> org.hibernate.PropertyValueException: not-null property references a 
> null or transient value: kopertownik.Lista.nazwa
> 
> 
>> a jak to nie zadziala to moze:
>>
>> Lista l = session.get(Lista.class, idDoUsuniecia);
>> session.delete(l);
>> tx.commit();
> 
> tu też:
> 
> 009-01-13 07:34:41 org.hibernate.util.JDBCExceptionReporter logExceptions
> WARNING: SQL Error: 0, SQLState: null
> 2009-01-13 07:34:41 org.hibernate.util.JDBCExceptionReporter logExceptions
> SEVERE: Zadanie wsadowe 0 delete from lista where id=108 zostało 
> przerwane. Wywołaj getNextException by poznać przyczynę.
> 2009-01-13 07:34:41 org.hibernate.util.JDBCExceptionReporter logExceptions
> WARNING: SQL Error: 0, SQLState: 23503
> 2009-01-13 07:34:41 org.hibernate.util.JDBCExceptionReporter logExceptions
> SEVERE: BŁĄD: update or delete on table "lista" violates foreign key 
> constraint "fk623639b6f4a8341" on table "listy"
>   Szczegóły: Key (id)=(108) is still referenced from table "listy".
> 
>>
>> Pozdrawiam
>> Jarek
>>
>>
> 
> pozdr.
> mk

Już jest ok, usunołem tabele w bazie, wrzuciłem w osoby.hbm.xml
lazy="true" inverse="true"

a pod przycisk dałem takie coś:

Session s=factory.openSession();
Transaction tx=s.beginTransaction();
Lista l =     (Lista) s.get(Lista.class,(Serializable) 
jTable1.getValueAt(jTable1.getSelectedRow(),0 ));
s.delete(l);
tx.commit();
    s.close();

pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143582
Author: mk
Date: Tue, 13 Jan 2009 16:40
10 lines
1780 bytes
mk pisze:

> Już jest ok, usunołem tabele w bazie, wrzuciłem w osoby.hbm.xml
> lazy="true" inverse="true"

to samo zrobiłem dla lista.hbm.xls i ładnie mi kasuje osoby z listy, a 
właściwie powiązania osoby i lista w tabeli listy.

pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143584
Author: Jarek
Date: Tue, 13 Jan 2009 18:37
10 lines
1756 bytes
A zobacz jeszcze czy po tych poprawkach zadziała wersja bez pobierania Listy 
z bazy, tzn. to:
Lista l = new Lista();
l.setId(idDoUsuniecia);
session.delete(l);

Bo wg. dokumentacji powinno to działać.

Pozdrawiam
Jarek 
Re: hibernate mapowanie kluczy obcych xml
#143583
Author: mk
Date: Tue, 13 Jan 2009 20:44
20 lines
1986 bytes
Jarek pisze:
> A zobacz jeszcze czy po tych poprawkach zadziała wersja bez pobierania 
> Listy z bazy, tzn. to:
> Lista l = new Lista();
> l.setId(idDoUsuniecia);
> session.delete(l);
> 
> Bo wg. dokumentacji powinno to działać.
> 
> Pozdrawiam
> Jarek

Nie, daje wyjątek:
not-null property references a null or transient value: 
kopertownik.Lista.nazwa

Wychodzi na to, że trzeba cały obiekt pobrać.

pozdr.
mk
Re: hibernate mapowanie kluczy obcych xml
#143586
Author: kamil.jedrzejuk
Date: Thu, 16 Oct 2014 12:13
1 lines
2011 bytes
Pytanie z innej beczki czemu Hibernate w OneToOne przenosi tylko klucz w BD w j jakby to było 0.1-0.N ? Czy to nie jest niezgodne z teoria ?
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