[Spring/Acegi/Hibernate] User authority objecten opslaan

Pagina: 1
Acties:

  • Bbfreak
  • Registratie: September 2002
  • Laatst online: 04-02 10:03
Probleem
Als ik een user toevoeg aan de database via een formulier wordt de gekoppelde Authority niet opgeslagen.

Info
UserFormController.java
Java:
1
2
3
4
5
6
7
// Save User   
Set<Authority> authorities = new HashSet<Authority>();
Authority auth = new Authority();
auth.setUser(user); auth.setAuthority("ROLE_USER");
user.setUserAuthorities(authorities);
            
userManager.saveUser(user);


User.hbm.xml
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<hibernate-mapping>
    <class name="org.ymor.repman.model.User" table="tbl_user">
        <id name="id" column="id" unsaved-value="null">
            <generator class="increment"/>
        </id>
        <property name="username" column="username" not-null="true"/>
        <property name="password" column="password" not-null="true"/>        
        <property name="enabled" column="enabled" not-null="true"/>
        <property name="actuate" column="actuate" not-null="true"/>
        <property name="usergroup" column="usergroup" not-null="true"/>
        <set name="userAuthorities" inverse="true" cascade="all-delete-orphan">
            <key column="userid"/>
            <one-to-many class="org.ymor.repman.model.Authority"/>
        </set>
    </class>
</hibernate-mapping>


Authority.hbm.xml
XML:
1
2
3
4
5
6
7
8
<hibernate-mapping>
    <class name="org.ymor.repman.model.Authority" table="tbl_authority">
        <composite-id>
            <key-many-to-one name="user" column="userid" class="org.ymor.repman.model.User"/> 
            <key-property name="authority" column="authority"/>
        </composite-id>
    </class>
</hibernate-mapping>


Extra info
  • Spring 1.2.8
  • Hibernate 2
  • Acegi 1.0.1
Ik heb op internet gezocht maar kan geen goede examples of uitleg vinden :?
Ik heb zelf het idee dat er een fout in mijn Hibernate mappings zit maar weet niet wat.
Wie kan mij in de goede richting sturen?

Twitter @cmeerbeek / Halo Waypoint Profile


Verwijderd

Hoe wil/verwacht je dat je database model eruit komt te zien?

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Ben je zeker dat je de mapping op deze manier wilt realiseren? Mij lijkt het logischer dat je er een n-op-n relatie van maakt. In de aard van:

User.hbm.xml
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<hibernate-mapping>
  <class name="org.ymor.repman.model.User" table="tbl_user">
        <id name="id" column="id" unsaved-value="null">
            <generator class="increment"/>
        </id>
        <property name="username" column="username" not-null="true"/>
        <property name="password" column="password" not-null="true"/>        
        <property name="enabled" column="enabled" not-null="true"/>
        <property name="actuate" column="actuate" not-null="true"/>
        <property name="usergroup" column="usergroup" not-null="true"/> 
        <set name="authorities" table="user_authority" cascade="save-update">
          <key column="userid"/>
          <many-to-many class="org.ymor.repman.model.Authority" column="authority"/>
        </set>
  </class>
</hibernate-mapping>


En dan Authority.hbm.xml als
XML:
1
2
3
4
5
6
7
8
9
10
11
12
<hibernate-mapping>
  <class name="org.ymor.repman.model.Authority" table="tbl_authority">
    <id name="authority" column="authority" unsaved-value="version">
      <generator class="assigned"/>
    </id>
    <version name="version" column="version"/>
    <set name="users" table="user_authority" cascade="save-update" inverse="true">
      <key column="authority"/>
      <many-to-many class="org.ymor.repman.model.User" column="userid"/>
    </set>
  </class>
</hibernate-mapping>

[ Voor 48% gewijzigd door -FoX- op 19-07-2006 13:44 ]


  • Bbfreak
  • Registratie: September 2002
  • Laatst online: 04-02 10:03
-FoX- schreef op woensdag 19 juli 2006 @ 13:43:
Ben je zeker dat je de mapping op deze manier wilt realiseren?
Ik wilde mapping realiseren zoals jij hem aangeeft maar daar ga ik nog een x naar kijken.
Omdat we voorlopig maar 1 ROLE hebben heb ik de authority String toegevoegd aan de user table.
Het is niet geweldig maar beter als niks. Vind het nog maar lastig werken dat Acegi.
Als je het doorhebt is het wel eenvoudig maar dat duurt wel even.

Bedankt iig.

Twitter @cmeerbeek / Halo Waypoint Profile


Verwijderd

Bbfreak schreef op woensdag 19 juli 2006 @ 14:21:
Vind het nog maar lastig werken dat Acegi
huh? Je hebt enkel een 'uitdaging' met hibernate. Dit heeft nog helemaal niets met acegi van doen. Als je gewoon even wilt spelen met acegi dan kun je ook een in-memory modelletje opzetten.

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Achja, Acegi is helemaal niet zo moeilijk als het op het eerste zicht lijkt. Je moet wel doorhebben wat er precies achter de schermen gebeurd om een goede opzet te kunnen doen. In dat opzicht kan het dus nog wel stukken eenvoudiger.

Als je mijn mapping zou gebruiken, dan ben je er toch?

  • Bbfreak
  • Registratie: September 2002
  • Laatst online: 04-02 10:03
-FoX- schreef op woensdag 19 juli 2006 @ 14:44:
Als je mijn mapping zou gebruiken, dan ben je er toch?
Ben er nu mee bezig :) Heb er nog een beetje ruzie mee.
Ik begrijp nl niet welke variabele het object Authority krijgt.
Moet ook nog even goed kijken wat die assigned precies doet.

Kun je dat uitleggen?

Twitter @cmeerbeek / Halo Waypoint Profile


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

assigned duidt erop dat de identifier door de applicatie geset wordt. In mijn geval heeft de authorities tabel enkel een 'name' en een 'description'. De 'name' is de assigned identifier en heeft vb ROLE_USER als waarde.

  • Bbfreak
  • Registratie: September 2002
  • Laatst online: 04-02 10:03
-FoX- schreef op woensdag 19 juli 2006 @ 15:28:
assigned duidt erop dat de identifier door de applicatie geset wordt. In mijn geval heeft de authorities tabel enkel een 'name' en een 'description'. De 'name' is de assigned identifier en heeft vb ROLE_USER als waarde.
Duidelijk! Nu heb ik alleen nog moeite met het version attribute.
Wat doet het en waarom is dat een unsaved-value?
Moet dit dan niet de description zijn die je hierboven aangeeft?
Die zie ik niet terug in je mapping. Kan natuurlijk zijn dat je die eruit gelaten hebt!

Twitter @cmeerbeek / Halo Waypoint Profile


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

version is eigenlijk niets meer dan een kolom in je tabel die de huidige versie van het gepersisteerde object gaat bijhouden, en bijgevolg ook zal ophogen als er nieuwe saves gedaan worden. Je moet dus wel in je tabel een extra kolom aanmaken die version noemt of tenminste waar version in gestockeerd kan worden.

De description heb ik er hier gewoon uitgelaten, omdat ik jouw voorbeeld zoveel mogelijk aangehouden heb. Zelf noem ik mijn authority gewoon role :)

  • momania
  • Registratie: Mei 2000
  • Laatst online: 22:03

momania

iPhone 30! Bam!

Probeer als unsaved value eens 'any'?
XML:
1
2
3
<id name="id" column="id" unsaved-value="any">
  <generator class="increment"/>
</id> 


Nu zet je het expliciet op null, dat wil zeggen dat je Authority object nu met z'n tijdelijke id (null dus in dit geval) in de Map gegooid wordt. De value vind je dus nooit meer terug en Hibernate dus ook niet. Die ziet een lege map, aangezien de keySet leeg is. :)

Met any wordt er een willekeurig tijdelijk id gebruikt, zodat je de map echt kan vullen. Na persisteren wordt deze vervangen met een echt id. :)

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

Pagina: 1