[Hibernate] eenzijdig mappen many-to-many

Pagina: 1
Acties:

  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Ik zit met een Hibernate mapping probleempje waar ik niet uit kom.

Situatie: tabel Instelling, tabel Eigenschap, koppeltabel InstellingEigenschappen. Oftewel een veel op veel relatie tussen Instelling en Eigenschap.

Ik heb geen behoefte aan een Set Instellingen in Eigenschap, dus ik wilde eigenlijk alleen een Set Eigenschappen in Instelling definieren. Mijn Hibernate mapping voor Instelling is nu als volgt:
XML:
1
2
3
4
5
6
7
8
9
10
<set
  name="eigenschappen"
  table="InstellingEigenschappen"
  lazy="false"
  cascade="save-update">
  <key column="Instelling_id"/>
  <many-to-many
    class="com.app.name.Eigenschap"
    column="Eigenschap_Id"/>
</set>

In de Hibernate mapping van Eigenschap is niets terug te zien van deze relatie.

Als ik nu een Instelling verwijder, dan worden de bijbehorende records uit InstellingEigenschappen ook netjes verwijderd. Verwijder ik een Eigenschap dan krijg ik een SQL fout op de InstellingEigenschappen tabel. De daarin aanwezige FK naar Eigenschap is niet meer geldig.

Ik heb het nu opgelost door een lazy set in de Hibernate mapping van Eigenschap te definieren. Wanneer ik nu een Eigenschap verwijder worden de bijbehorende records uit de koppeltabel ook verwijderd. Ik baal alleen van die onnodige set definitie. Mijn Eigenschap class heeft nu ook een Set Instellingen die ik nooit zal gebruiken..

Is er een manier om vanuit de Hibernate mapping van Instelling te regelen dat zowel van Instelling naar InstellingEigenschappen, als van Eigenschap naar InstellingEigenschappen een cascade moet plaatsvinden?

[ Voor 6% gewijzigd door zneek op 31-05-2005 17:02 ]


  • Antediluvian
  • Registratie: Maart 2002
  • Laatst online: 04-05 10:30
Volgens mij kan je dit doen door gebruik te maken van cascade="all,delete-orphan"

FF een quote uit de online reference:
Setting a value of the cascade attribute to any meaningful value other than none will propagate certain operations to the associated object. The meaningful values are the names of Hibernate's basic operations, persist, merge, delete, save-update, evict, replicate, lock, refresh, as well as the special values delete-orphan and all and comma-separated combinations of operation names, for example, cascade="persist,merge,evict" or cascade="all,delete-orphan". See Section 11.11, “Transitive persistence” for a full explanation.

[ Voor 5% gewijzigd door Antediluvian op 01-06-2005 04:13 ]


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Antediluvian schreef op dinsdag 31 mei 2005 @ 23:53:
Volgens mij kan je dit doen door gebruik te maken van cascade="all,delete-orphan"

FF een quote uit de online reference:


[...]
Nee, daar heb ik niks aan. Ik wil juist dat Eigenschap een eigen leven kan lijden, ook zonder gekoppeld te zijn aan een Instelling. De situatie moet zijn:

1. Verwijder Instelling, dan verwijder ook alle InstellingEigenschappen van die Instelling
2. Verwijder een Eigenschap, verwijder dan ook alle InstellingEigenschappen van die Eigenschap

Als ik cascade="all" gebruik worden eventueel ongekoppelde Eigenschappen meeverwijderd. En als ik een eigenschap verwijder worden de bijbehorende InstellingEigenschappen niet meeverwijderd, en krijg ik dus die SQL fout.

[ Voor 3% gewijzigd door zneek op 01-06-2005 11:59 ]


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 05-05 14:48
Tja, of je van een extra set in je POJO nou wakker moet liggen... Desnoods maak je een trigger in je database (goed, is denk nog lelijker...) of pas je Hibernate aan.

Relationele databases mappen nou eenmaal niet perfect op een object georienteerde structuur denk ik dan maar.