Archief - [PROG]Java Hibernate en Java 6 Enum Klasse

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

tmagus

Legacy Member
Ik heb dus een probleemke

Ik probeer dus een Enum klasse geslacht te mappen met hibernate, het wegschrijven van de enum lukt me dus wel maar het terug ophalen loopt dus altijd mis.

Na wat opzoek werk bleek dus da ge best zelf een Type maakt, nu ik heb gebruikt gemaakt van bestaande code: http://www.hibernate.org/272.html

Waarbij het wegschrijven terug perfect lukt maar het ophalen deze Error geeft:
Code:
org.hibernate.HibernateException: Exception while invoking valueOf method 'fromInt' of enumeration class 'class edu.fregusoft.utilities.Geslacht'
	at edu.fregusoft.utilities.hibernate.GenericEnumUserType.nullSafeGet(GenericEnumUserType.java:137)
	at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:105)
	at org.hibernate.type.AbstractType.hydrate(AbstractType.java:81)
	at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2096)
	at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1380)
	at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1308)
	at org.hibernate.loader.Loader.getRow(Loader.java:1206)
	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:580)
	at org.hibernate.loader.Loader.doQuery(Loader.java:701)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
	at org.hibernate.loader.Loader.doList(Loader.java:2220)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
	at org.hibernate.loader.Loader.list(Loader.java:2099)
	at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
	at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:305)
	at edu.fregusoft.persistentie.hibernate.GenericHibernateDAO.findByProperty(GenericHibernateDAO.java:115)
	at edu.fregusoft.persistentie.dao.GebruikerDAO.getUserByUsername(GebruikerDAO.java:20)
	at edu.fregusoft.services.GebruikerService.getUserByUsername(GebruikerService.java:69)
	at edu.fregusoft.persistentie.hibernate.servlet.CreateDB.doGet(CreateDB.java:56)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at edu.fregusoft.persistentie.hibernate.filter.OpenSession.doFilter(OpenSession.java:80)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at edu.fregusoft.utilities.hibernate.GenericEnumUserType.nullSafeGet(GenericEnumUserType.java:135)
	... 37 more

Mijn enum Klasse Geslacht:
Code:
package edu.fregusoft.utilities;

/**
 * Deze klasse is een enumerator voor het geslacht van een persoon: M(annelijk) of V(rouwelijk).
 * @author FreGuSoft
 * @since 20071109
 */
public enum Geslacht {
	U(-1), M(0), V(1);
	
	int value;
	
	private Geslacht(int value) {
		 this.value = value;
	}
	
	public int toInt()
	{
		return value;
	}
	
	public Geslacht fromInt(int value)
	{
		switch(value)
		{
		case 0: return M;
		case 1: return V;
		default: return U;
		}
	}

Stuk van mapping file:
Code:
<hibernate-mapping default-cascade="all"
	package="edu.fregusoft.domein.contactenbeheer">
	<typedef name="EnumGeslacht" class="edu.fregusoft.utilities.hibernate.GenericEnumUserType">
 		<param name="enumClass">edu.fregusoft.utilities.Geslacht</param>
 		<param name="identifierMethod">toInt</param>
 		<param name="valueOfMethod">fromInt</param>
 	</typedef>
 	
	<class name="Persoon" abstract="true">
		<id name="id" column="persoonID" type="long">
			<generator class="native" />
		</id>
		<property name="naam" column="NAAM" type="string" />
		<property name="voornaam" column="VOORNAAM" type="string" />
		<property name="geboortedatum" column="GEBOORTEDATUM"
			type="calendar_date" />
		<property name="geslacht" column="GESLACHT" type="EnumGeslacht"/>

Ik weet dus nie echt wat er misloopt... of dat er mss een ander makkelijker manier is om een enum opteslaan en terug te halen via mapping van hibernate, heb ook al gevonden dat annotations blijkbaar daar wel een type voor hebben vb daar van is "@Enumerated(value=EnumType.STRING)" bestaat er dan zoietske voor gewone mapping file's ook? want ik vin het nie direct terug?

Of een oplossing voor mijn bovenstaand probleem is ook altijd welkom,

alvast bedankt :)

Kn0t

Legacy Member
Die fromInt methode moet hoogstwaarschijnlijk static zijn.

En ik zou die int value in je enum ook private maken ;)

tmagus

Legacy Member
Kn0t zei:
Die fromInt methode moet hoogstwaarschijnlijk static zijn.

En ik zou die int value in je enum ook private maken ;)

indeed met die static lijk het op het eerste zicht te lukken...

Khad het ook al werkend gekregen maar dan op een ander manier aan de hand van de annotions jar van hibernate, want er zit daar ook een klasse in die enum ondersteund voor annotions, org.hibernate.type.EnumTyp die je dan kan gebruiken in je mapping file, zal morgen ess posten :)

alvast bedankt

oja iknw about the private stuff :p was gewoon vlugge copy paste :p

tmagus

Legacy Member
Bavo aka Joske zei:
Gebruik annotaties aub

Hoe bedoel je?

Volledig annotaties gebruiken = geen mappinfile's :p

of bedoelde de annotaties klasse type gebruiken voor enum in mapping file te mappen :), gewoon de jar annotations toevoegen aan je project om de klasse te kunnen gebruiken :) en meer hoeft er nie gedaan te worden.

EDIT zo als beloofd mapping van enumtype annotations
Code:
		<property name="geslacht" column="GESLACHT" length="1">
			<type name="org.hibernate.type.EnumType">
				<param name="enumClass">edu.fregusoft.utilities.Geslacht</param>
				<param name="type">12</param>
			</type>
		</property>
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan