[Hibernate] Join-tabel omzetten naar Map<key, value>

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • F e r o x
  • Registratie: Mei 2006
  • Laatst online: 18-11-2024
Ik heb 2 type databags in mijn Java-applicatie. De ene stelt een 'Klas' voor (een groep leerlingen dus) en de andere is een 'Proef'. Het is nu de bedoeling dat de verschillende proeven die een klas mag uitvoeren gekoppeld worden via een collection in het object 'Klas'.

In mijn database heb ik daarom 3 tabellen: 'klassen' (met PK 'klas_id'), 'proeven' (met PK 'pro_id') en ook nog een tussen-tabel 'klas_proeven' met twee foreign keys naar de specieke klas 'klaspr_klas_id' en naar de specifieke proef 'klaspr_pro_id' en nog een derde kolom namelijk 'klaspr_verplicht' waarmee kan aangeduid worden of een proef verplicht is om uit te voeren.

Via annotations koppel ik de database-tabellen aan de databags. Tot hiertoe nog geen problemen gehad, maar nu lukt het me niet om een 'Map' te gebruiken waarin de verschillende proeven als key staan, en de value als waarde telt of een proef al dan niet verplicht is om uit te voeren.

Ik heb tot nu toe volgende code:
code:
1
2
3
4
    @CollectionOfElements
    @JoinTable(name = "klas_proeven", joinColumns = @JoinColumn(name = "klaspr_klas_id"))
    @MapKey(columns={@Column(name="klaspr_verplicht")})
    private Map<Proef,String> proeven;


Ik vind wel informatie op het internet hiermee in verband, maar het is bijna altijd met xml-mapping. Er is zeer weinig goede info te vinden ivm. annotations. Iemand die hiermee goede ervaring heeft?

Acties:
  • 0 Henk 'm!

  • F e r o x
  • Registratie: Mei 2006
  • Laatst online: 18-11-2024
Niemand hier die ervaring heeft met Hibernate?

Acties:
  • 0 Henk 'm!

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 22:54

GrimaceODespair

eens een tettenman, altijd ...

Heb alleen elementaire ervaring met NHibernate en ActiveRecord (wat ook met attributen werkt). In het verleden was het zo dat niet elke mogelijke xml-mapping ook met ActiveRecord kon uitgedrukt worden, maar ik weet niet wat de toestand nu is. Bovendien heeft het lang geduurd voordat er degelijke voorbeelden op internet terechtkwamen wanneer het ging om collecties (en collecties zijn altijd het struikelblok bij (n)Hibernate).

Om kort te gaan: eigenlijk kan ik je helemaal niet helpen :D Wellicht kan je eens zoeken of er xml-constructies zijn die niet met annotations zijn uit te drukken, en zit de jouwe daartussen. En anders ben je aan het pionieren ;)

Wij onderbreken deze thread voor reclame:
http://kalders.be


Acties:
  • 0 Henk 'm!

  • bat266
  • Registratie: Februari 2004
  • Laatst online: 24-08 06:41
Ik los het probleem van een extra waarde in een tussen tabel meestal op door een klasse te maken die de tussentabel voorsteld en deze klasse dan met twee one-to-many links te koppelen.

Dit is puur omdat ik het in het verleden niet voor elkaar kreeg om dit met annotaties te laten werken. Daarmee wil ik dus uitdrukkelijk niet zeggen dat het niet kan.

Better to remain silent and be thought a fool then to speak out and remove all doubt.


Acties:
  • 0 Henk 'm!

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 15:31
Wat je verkeerd doet is dat je bij de annotations de map key op de "verplicht" value hebt ingesteld in plaats van de Proef entity. Daarvoor moet je MapKeyManyToMany gebruiken. Het volgende werkt prima bij mij:

Java:
1
2
3
4
5
6
7
8
    @org.hibernate.annotations.CollectionOfElements
    @Column(name="klaspr_verplicht", nullable=false)
    @org.hibernate.annotations.MapKeyManyToMany(
        joinColumns = @JoinColumn(name = "klaspr_proef_id")
    )
    @JoinTable(name = "klas_proeven", joinColumns = @JoinColumn(name="klaspr_klas_id"))
    // containsKey() == true: proef van toepassing voor klas, get() == true: proef is verplicht
    private Map<Proef,Boolean> proeven = new HashMap<Proef,Boolean>();

Acties:
  • 0 Henk 'm!

  • F e r o x
  • Registratie: Mei 2006
  • Laatst online: 18-11-2024
Bedankt! Werkt perfect!


Ik krijg wel een vreemde melding in Netbeans:

basic attributes can only be of the following types: java primitive types,wrapper of primitive types, String, java.math.bigInteger, java.math.BigDecimal, java,util.Date, java.util.Calendar, java.sql.Data, java.sql.TimeStamp, byte[], Byte[], char[], Character[], enums, or any Serializable type

Ik kan wel compilen dus een echte error is het niet (tenzij er later misschien een runtime error opduikt). Het probleem duikt op bij:
private Map<Proef,String> proeven = new HashMap<Proef,String>();

Nochtans is Proef serializable en is String ook geldig?
Pagina: 1