[Hibernate] object laden

Pagina: 1
Acties:

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 04-05 13:54
Sorry voor de wat onduidelijke titel, maar ik wist niet direct hoe het probleem te formuleren. Het gaat als volgt:

We hebben een oude applicatie die geen gebruik maakt van hibernate. Hiervan willen we in de nieuwe applicatie (die wel gebruik maakt van hibernate) een object + overneenkomstige tabel gebruiken.

Simpel voorgesteld:

We hebben een Deelnemer deze heeft een adres een een postadres alletwee van het type Adres. Deelnemer en Adres zijn beide gemapt op een tabel in de databank, waar de deelnemer tabel een adresid en postadresid heeft, deze kolommen naar de primary key van dat adres in de adres tabel.

Het zit nu zo dat niet elke deelnemer altijd een postadres heeft, wanneer een deelnemer geen postadres heeft dan wordt door de oude applicatie een NULL id weggeschreven in de kolom postadres van de Deelnemer tabel.

Nu zou ik willen via hibernate een Deelnemer laden en bewaren. Als dit postadres leeg is wil ik dat hibernate ervoor zorgt dat hier automatisch een nieuw adres object ingeplaatst wordt (omdat ik in de view dan geen extra controle hoeft te doen op null waarden). Ik wil dus niet overal in men code gaan controleren of postadres al dan niet null is.

Omgekeerd zal waarschijnlijk moeilijk gaan om ervoor te zorgen dat hibernate geen leeg object bewaart, voorlopig roep ik rechtstreeks de save van Deelnemer op en daar controleer ik of postadres effectief nuttige informatie bevat, indien dit niet zo is verander ik deze in null en pas dan bewaar ik deelnemer.

Maar als deelnemer een child is van een parent object en ik bewaar het parent object dan kan ik deze manuele controle niet meer uitvoeren... en bewaart hiberante dus een leeg postadres in de databank ipv een null.

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • momania
  • Registratie: Mei 2000
  • Laatst online: 19:41

momania

iPhone 30! Bam!

Geef eens wat code voorbeelden, want ik begrijp nu niet helemaal waar je naar toe wilt.

Klinkt als het wel willen aanpassen/verbeteren van een applicatie waar je met een design zit dat niet klopt en je niet wilt veranderen. :)

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Ik zou eens naar het special case of null object design pattern kijken.

http://www.martinfowler.com/eaaCatalog/specialCase.html

En dan in je DAO of service layer alvorens een deelnemer te saven kijken of het adres een UnkownAdres is en dan op null zetten. En nadat de deelnemer geladen is kijken of het adres null is, zo ja een UnkownAdres instantie zetten.
Cuball schreef op woensdag 03 augustus 2005 @ 10:28:
Sorry voor de wat onduidelijke titel, maar ik wist niet direct hoe het probleem te formuleren. Het gaat als volgt:

We hebben een oude applicatie die geen gebruik maakt van hibernate. Hiervan willen we in de nieuwe applicatie (die wel gebruik maakt van hibernate) een object + overneenkomstige tabel gebruiken.

Simpel voorgesteld:

We hebben een Deelnemer deze heeft een adres een een postadres alletwee van het type Adres. Deelnemer en Adres zijn beide gemapt op een tabel in de databank, waar de deelnemer tabel een adresid en postadresid heeft, deze kolommen naar de primary key van dat adres in de adres tabel.

Het zit nu zo dat niet elke deelnemer altijd een postadres heeft, wanneer een deelnemer geen postadres heeft dan wordt door de oude applicatie een NULL id weggeschreven in de kolom postadres van de Deelnemer tabel.

Nu zou ik willen via hibernate een Deelnemer laden en bewaren. Als dit postadres leeg is wil ik dat hibernate ervoor zorgt dat hier automatisch een nieuw adres object ingeplaatst wordt (omdat ik in de view dan geen extra controle hoeft te doen op null waarden). Ik wil dus niet overal in men code gaan controleren of postadres al dan niet null is.

Omgekeerd zal waarschijnlijk moeilijk gaan om ervoor te zorgen dat hibernate geen leeg object bewaart, voorlopig roep ik rechtstreeks de save van Deelnemer op en daar controleer ik of postadres effectief nuttige informatie bevat, indien dit niet zo is verander ik deze in null en pas dan bewaar ik deelnemer.

Maar als deelnemer een child is van een parent object en ik bewaar het parent object dan kan ik deze manuele controle niet meer uitvoeren... en bewaart hiberante dus een leeg postadres in de databank ipv een null.

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 04-05 13:54
dit is de mapping van een Deelnemer

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<hibernate-mapping>
    <class name="be.xx.apartment.vo.Participant" table="pvacparti" lazy="false">
        <id name="participantId" type="long" unsaved-value="null">
            <generator class="native"/>
        </id > 
    
        <property name="lastName"/>
        <property name="firstName"/>
        <property name="birthDate"/>
        <property name="male"/>
        <property name="telephoneNumber"/>
        <property name="mobileNumber"/>
        <property name="faxNumber"/>
        <property name="email"/>
        <property name="officeTelephoneNumber"/>
        <property name="escort"/>
        <property name="accountNumber"/>
                <property name="organisation"/>
        <many-to-one name="address"  class="be.xx.apartment.vo.Address" column="addressid" cascade="save-update"/>
        <many-to-one name="postalAddress"  class="be.xx.apartment.vo.Address"  column="postalAddressid" cascade="save-update"/>


dit is de code van een adres

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<hibernate-mapping>
    <class name="be.xx.apartment.vo.Address" table="pvacaddr" lazy="false">
        <id name="addressId" type="long" unsaved-value="null">
            <generator class="native"/>
        </id> 

        <property name="street"/>
        <property name="number"/>
        <property name="box"/>
        <property name="zip"/>
        <property name="city"/>
        <property name="country"/>

        <property name="createUser"/>
        <property name="createTime"/>
        <property name="updateUser"/>
        <property name="updateTime"/>

    </class>
</hibernate-mapping>


als ik nu een deelnemer laad (die wegschreven is door de oude applicatie en dus postadres null bevat) dan zou ik willen dat deze automatisch opgevuld wordt door een adres object

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Even een algemene opmerking:
Ik zou adres geen entity laten zijn, maar een component. Je kunt met hibernate eenvoudig components mappen.. dus dat is al geen probleem.

vb:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<hibernate-mapping>

    <class
            name="anchormen.domain.Klant"
            table="Klant">

        <id
                name="id"
                type="java.lang.Long"
                column="KLT_id"
                unsaved-value="null">
            <generator class="native"/>
        </id>

        <property
                name="bedrijfnaam"
                type="java.lang.String"
                column="Bedrijfnaam"
                not-null="true"
                length="50"/>

        <component
                name="postbus"
                class="anchormen.domain.Postbus">
            <property name="nummer"
                      type="string"
                      column="Postbus_Nummer"
                      not-null="false"/>
            <property name="postcode"
                      type="string"
                      column="Postbus_Postcode"
                      not-null="false"/>
            <property name="plaats"
                      type="string"
                      column="Postbus_Plaats"
                      not-null="false"/>
        </component>

        

    </class>
</hibernate-mapping>

[ Voor 231% gewijzigd door Alarmnummer op 03-08-2005 23:47 ]


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 04-05 13:54
Alarmnummer schreef op woensdag 03 augustus 2005 @ 12:13:
Even een algemene opmerking:
Ik zou adres geen entity laten zijn, maar een component. Je kunt met hibernate eenvoudig components mappen.. dus dat is al geen probleem.
dan worden de adres gegevens per deelnemer in de deelnemer tabel bewaard. Op zich niet zo'n slecht idee, maar 2 problemen:
  • tabellen bestaan reeds en moeten zo gebruikt worden
  • adres kan bij verschillende deelnemers gebruikt worden (bv gezin die op het zelfde adres woont)

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 04-05 13:54
nog andere mogelijkheden hiervoor ?

ik vind het nog omslachtig om telkens te controleren wanneer een Deelnemer object geladen wordt of het postadres niet null is, en indien dit zo is hier manueel een nieuw adres object in te plakken

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Je kunt nog met de lifecycle methodes gaan stoeien. Je kunt als je wilt callback krijgen van hibernate als een object ingeladen, gedelete ed wordt.
Pagina: 1