# Spring/Hibernate exception



## Gast2 (9. Dez 2009)

Hallo zusammen,

ich hätte nochmal ein paar fragen zu spring und hibernate zusammen... 
wenn ich meine anwendung starte bekomme ich folgenden consolen log...

```
09.12.2009 23:35:56 org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1359c1b: startup date [Wed Dec 09 23:35:56 CET 2009]; root of context hierarchy
09.12.2009 23:35:56 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
09.12.2009 23:35:56 org.springframework.core.io.support.PropertiesLoaderSupport loadProperties
INFO: Loading properties file from class path resource [jdbc.properties]
09.12.2009 23:35:56 org.springframework.context.support.AbstractApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
INFO: Bean 'dataSource' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
09.12.2009 23:35:57 org.springframework.orm.hibernate3.LocalSessionFactoryBean buildSessionFactory
INFO: Building new Hibernate SessionFactory
09.12.2009 23:35:57 org.springframework.context.support.AbstractApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
INFO: Bean 'sessionFactory' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
09.12.2009 23:35:57 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@e53220: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,txManager,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,dataSource,sessionFactory,kundenDAO,kundenService,kunde]; root of factory hierarchy
09.12.2009 23:35:58 org.springframework.orm.hibernate3.HibernateTransactionManager afterPropertiesSet
INFO: Using DataSource [org.apache.commons.dbcp.BasicDataSource@aa3518] of Hibernate SessionFactory for HibernateTransactionManager
```

jetzt rufe ich folgende methode auf

```
kunde = ServiceManager.getInstance().getKundenService().searchKundeById(Long.valueOf(1));
System.out.println(kunde.getName());
```


```
public class ServiceManager {
	
	private static ServiceManager instance;
	private ApplicationContext ctx;
	
	private ServiceManager () {
		 ctx = new ClassPathXmlApplicationContext("applicationContext.xml");  
	}

	public static synchronized ServiceFactory getInstance() {
		if(instance == null) instance = new ServiceManager ();
		return instance;
	}
	
	public KundenService getKundenService(){
		return ctx.getBean("kundenService", KundenService.class);
	}
}
```

und bekomm folgende Exception, die mir nichts sagt

```
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
	at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:86)
	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:140)
	at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
	at dbobjects.impl.KundeHibernateImpl_$$_javassist_0.getName(KundeHibernateImpl_$$_javassist_0.java)
```

Das komische ist das mein Unit test aber funktioniert und den GLEICHEN service aufruft...


```
@ContextConfiguration(locations={"/applicationContext.xml"})
@TransactionConfiguration(defaultRollback=true)
public class KundenServiceTest extends AbstractTransactionalJUnit4SpringContextTests {
	
	@Autowired
	private KundenService kundenService;
	
	@Test
	public void testSerchKunde() throws Exception {
		Kunde kunde = null;
		kunde  = kundenService.searchKundeById(Long.valueOf(1));
		System.out.println(kunde.getName());
		assertEquals(Long.valueOf(1), kunde.getId());
	}
}
```

Ausgabe
	
	
	
	





```
09.12.2009 23:50:06 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
09.12.2009 23:50:06 org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.GenericApplicationContext@1e4457d: startup date [Wed Dec 09 23:50:06 CET 2009]; root of context hierarchy
09.12.2009 23:50:06 org.springframework.core.io.support.PropertiesLoaderSupport loadProperties
INFO: Loading properties file from class path resource [jdbc.properties]
09.12.2009 23:50:06 org.springframework.context.support.AbstractApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
INFO: Bean 'dataSource' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
09.12.2009 23:50:07 org.springframework.orm.hibernate3.LocalSessionFactoryBean buildSessionFactory
INFO: Building new Hibernate SessionFactory
09.12.2009 23:50:07 org.springframework.context.support.AbstractApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
INFO: Bean 'sessionFactory' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
09.12.2009 23:50:07 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@6ac461: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,transactionManager,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,dataSource,sessionFactory,kundenDAO,kundenService,kunde]; root of factory hierarchy
09.12.2009 23:50:08 org.springframework.orm.hibernate3.HibernateTransactionManager afterPropertiesSet
INFO: Using DataSource [org.apache.commons.dbcp.BasicDataSource@2515] of Hibernate SessionFactory for HibernateTransactionManager
09.12.2009 23:50:08 org.springframework.test.context.transaction.TransactionalTestExecutionListener startNewTransaction
INFO: Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@a68fd8]; rollback [true]
Hibernate: select kundehiber0_.id as id0_0_, kundehiber0_.bonus as bonus0_0_, kundehiber0_.email as email0_0_, kundehiber0_.geb as geb0_0_, kundehiber0_.handynummer as handynum5_0_0_, kundehiber0_.name as name0_0_, kundehiber0_.ort as ort0_0_, kundehiber0_.plz as plz0_0_, kundehiber0_.strasse as strasse0_0_, kundehiber0_.tel as tel0_0_, kundehiber0_.vorname as vorname0_0_ from Kunde kundehiber0_ where kundehiber0_.id=?
Dennis
09.12.2009 23:50:08 org.springframework.test.context.transaction.TransactionalTestExecutionListener endTransaction
INFO: Rolled back transaction after test execution for test context [[TestContext@13fba1 testClass = KundenServiceTest, locations = array<String>['classpath:/applicationContext.xml'], testInstance = kunde.KundenServiceTest@1ed27e4, testMethod = testSerchKunde@KundenServiceTest, testException = [null]]]
```

Sieht jemand einen Fehler?

Die 2te Frage wäre, wenn ich einen Kunde suche den es nicht gibt, bekomme ich dann eine Exception geworfen dass ich dem Anwender sagen kann Kunde nicht vorhanden oder sowas??

Danke schon mal


----------



## Noctarius (10. Dez 2009)

Du nutzt glaub ich den falschen (alten) Hibernate-Adapter, der kommt mit dem BeanPostProcessor (z.B. für Context-Annotations und Transaction-Annotations nicht klar).

Und nein du bekommst keine Exception geworfen aber du kannst die Menge des Resultlist anschauen und eine Exception wie z.B. NoSuchEntryException werfen 

PS: Hier mal ein Beispiel für einen Hibernate JPA AppContext (aus einem kleinen Programm von mir)
[xml]<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
Index of /schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
Index of /schema/context
http://www.springframework.org/schema/context/spring-context-2.1.xsd
Index of /schema/tx
           http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
	default-autowire="byName">

	<context:annotation-config />
	<tx:annotation-driven transaction-manager="transactionManager" />

	<bean
		class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
	<bean
		class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

	<!-- Retrieve properties from external Properties file -->
	<bean id="propertyConfigurator"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location">
			<value>/WEB-INF/config/jdbc.properties
			</value>
		</property>
	</bean>

	<!-- Datasource Connection Pool -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName">
			<value>${datasource.driver}</value>
		</property>
		<property name="url">
			<value>${datasource.url}</value>
		</property>
		<property name="username">
			<value>${datasource.username}</value>
		</property>
		<property name="password">
			<value>${datasource.password}</value>
		</property>
	</bean>

	<!-- Hibernate configuration -->
	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="persistenceUnitName" value="default" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="showSql" value="${datasource.showsql}" />
				<property name="generateDdl" value="true" />
				<property name="databasePlatform" value="${datasource.dialect}" />
			</bean>
		</property>
		<property name="loadTimeWeaver">
			<bean
				class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
		</property>
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.hbm2ddl.auto ">create-drop</prop>
			</props>
		</property>
	</bean>
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>


	<!-- Dao SpringBeans -->
	<bean class="com.bundle.source.dao.DaoHelper">
		<property name="statusDao">
			<bean class="com.bundle.source.dao.StatusDao">
				<property name="entityManagerFactory" ref="entityManagerFactory" />
			</bean>
		</property>
		<property name="taskDao">
			<bean class="com.bundle.source.dao.TaskDao">
				<property name="entityManagerFactory" ref="entityManagerFactory" />
			</bean>
		</property>
		<property name="userDao">
			<bean class="com.bundle.source.dao.UserDao">
				<property name="entityManagerFactory" ref="entityManagerFactory" />
			</bean>
		</property>
	</bean>



	<!-- Actions Lookup -->
	<bean name="/ListTasks" class="com.bundle.source.struts.action.ActionTaskList" />
	<bean name="/AddTask" class="com.bundle.source.struts.action.ActionTaskAdd" />
	<bean name="/EditTask" class="com.bundle.source.struts.action.ActionTaskEdit" />
	<bean name="/DeleteTask" class="com.bundle.source.struts.action.ActionTaskDelete" />

	<bean name="/ListUsers" class="com.bundle.source.struts.action.ActionUserList" />
	<bean name="/AddUser" class="com.bundle.source.struts.action.ActionUserAdd" />
	<bean name="/EditUser" class="com.bundle.source.struts.action.ActionUserEdit" />
	<bean name="/DeleteUser" class="com.bundle.source.struts.action.ActionUserDelete" />
</beans>[/xml]


----------



## Gast2 (10. Dez 2009)

Noctarius hat gesagt.:


> Du nutzt glaub ich den falschen (alten) Hibernate-Adapter, der kommt mit dem BeanPostProcessor (z.B. für Context-Annotations und Transaction-Annotations nicht klar).



Mhm werd ich nochmal prüfen ob ich da was verhauen hab ...
Dachte eigentlich hab die Einstellung von byte genommen...
http://www.java-forum.org/application-tier/90335-transaktionen-spring-2.html
Hab mich aber auch schon über den komischen Outout gewundert...
Finds halt nur komisch, dass der Unit Test geht ist ja die gleiche xml ???:L
Stell heut abend vielleicht nochmal kurz meine xml rein, wenn ich dort kein Fehler find



Noctarius hat gesagt.:


> Und nein du bekommst keine Exception geworfen aber du kannst die Menge des Resultlist anschauen und eine Exception wie z.B. NoSuchEntryException werfen


ich denk mal dass ist ja Hibernate abhängig also wenn ich 
	
	
	
	





```
sessionFactory.load()
```
 mach und er die id nicht findet schmeißt hibernat laut API eine exception... aber ich weiß nicht was spring damit macht ^^...


----------



## Gast2 (11. Dez 2009)

So sieht meine xml aus...

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
Index of /schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
Index of /schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
Index of /schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

	<context:annotation-config/>
	<!-- enable the configuration of transactional behavior based on annotations -->
	<tx:annotation-driven transaction-manager="transactionManager" />

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>


	<contextroperty-placeholder location="classpath:jdbc.properties" />    

    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />


	<!-- the DataSource (parameterized for configuration via a PropertyPlaceHolderConfigurer) -->
    <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--  Hibernate  -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
		<property name="configLocation" value="hibernate.cfg.xml" />
		<property name="dataSource" ref="dataSource" />
	</bean>


	<!-- Hibernate DAO -->
    <bean id="kundenDAO" class="dao.impl.HibernateKundenDAOImpl"/>

	<!-- Services  -->
    <bean id="kundenService" class="service.impl.KundenServiceImpl"/>

	<!--  -->
	<bean id="kunde" class="dbobjects.impl.KundeHibernateImpl" scope="prototype"/>

</beans>

[/XML]


----------



## Noctarius (11. Dez 2009)

Nutzt du denn JPA? Wenn ja, wieso nicht die JPA-Klassen von Spring nutzen?


----------



## Gast2 (11. Dez 2009)

Nee wie du siehts benutz ich doch Hibernate ???


----------



## Noctarius (11. Dez 2009)

Hibernate hat eine JPA Implementierung. JPA ist ein Standard für den mehrere Implementierungen (z.B. eben Hibernate oder EclipseLink, ...) existieren. Hibernate zu nutzen ist also kein Ausschlusskriterium für JPA (die Java Persistence API).


----------



## Gast2 (11. Dez 2009)

Noctarius hat gesagt.:


> Hibernate hat eine JPA Implementierung. JPA ist ein Standard für den mehrere Implementierungen (z.B. eben Hibernate oder EclipseLink, ...) existieren. Hibernate zu nutzen ist also kein Ausschlusskriterium für JPA (die Java Persistence API).


Bin ich mir bewusst...^^

aber ich benutz die sessionFactory die von Hibernate kommt...


----------



## Noctarius (11. Dez 2009)

Hm zu Hibernate pur weiß ich dann auch nicht  (noch nie versucht)


----------



## Gast2 (11. Dez 2009)

Noctarius hat gesagt.:


> Hm zu Hibernate pur weiß ich dann auch nicht  (noch nie versucht)



ja ich versuch mal was ich aus deiner xml so rauslesen kann...
hab gehofft byte findet was  ,weil er nutz ja auch hibernate ^^...

wie gesagt komisch find ich immer nur dass der Unit test ohne Probleme funktioniert...
Was ich mir noch denken dann dass ich iwie das XML in meiner Anwendung falsche lade...


----------



## Noctarius (12. Dez 2009)

Ich hab da auch Hibernate im Hintergrund genutzt nur eben mit JPA als Layer darüber


----------



## byte (12. Dez 2009)

Hi.

Auf den ersten Blick sieht die Konfig gut aus. Wie sieht denn die searchKundeById Methode aus? Lädst Du die evtl. mit 
	
	
	
	





```
Session#load()
```
? Wenn ja, dann versuchs mal mit 
	
	
	
	





```
Session#get()
```
. Ersteres lädt Entitäten nämlich nicht direkt, sondern erzeugt einen Proxy, der die Daten dann lazy nachlädt. Wenn die Session dann schon zu ist, dann krachts. Beim Unittest fällt das nicht auf, weil dort die Session während der gesamten Testmethode offen ist.

Ansonsten wäre noch interessant zu wissen, wie der Service aussieht, also wo die Transaktion auf und zu geht. Hast Du die Service Methode mit @Transactional annotiert? Wichtig ist zu wissen, dass sobald die Transaktion zu ist, auch die Session geschlossen wird. Das heisst, die Entities sind danach detached. Du kannst dann nicht mehr auf lazy Attribute zugreifen, die noch nicht geladen wurden. Im Endeffekt heisst das, einzelne Entities immer schön mit get() statt load() laden und Assoziation (one-to-many usw) immer schön vorher laden, z.B. per fetch join.


----------



## Gast2 (12. Dez 2009)

byte hat gesagt.:


> Hi.
> 
> Auf den ersten Blick sieht die Konfig gut aus. Wie sieht denn die searchKundeById Methode aus? Lädst Du die evtl. mit
> 
> ...




haha danke des hab ich auch grad rausgefunden dass wenn ich das objekt hole und "clone" quasi eine neue instanz mache dass es dann funktioniert... und meine frage wäre gewesen ob es da nicht was besseres gibt ^^ ok dann versuch ich mal get und "clone" mein objekt nicht...
weil insert,delete hat funktioniert... was ich mich auch noch ein bischen wundert, dass wenn ich eine Criteria mache und mir eine Liste von Objekten zurück geben lasse, dass ich dieses Problem dann nicht habe, werden da keine Proxys gemacht??
zu @Transactional hab ich gemacht und schließt spring nach der methode automatisch die session oder muss ich da noch was machen???

hier mal was ich gemacht habe
service

```
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
	@Override
	public List<Kunde> searchAllKunde() {
		return kundenDAO.getAllKunde();
	}

	@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
	@Override
	public Kunde searchKundeById(Long id) {
		 return kundenDAO.getKundeById(id);
```


```
public class HibernateKundenDAOImpl implements KundenDAO{

	@Autowired
	private SessionFactory sessionFactory;
	
	@Override
	@Transactional(propagation = Propagation.MANDATORY)
	public Kunde getKundeById(Long id) {
		return (Kunde) sessionFactory.getCurrentSession().load(KundeHibernateImpl.class, id);
		
	}

	@Transactional(propagation = Propagation.MANDATORY)
	@Override
	public List<Kunde> getAllKunde() {
		Criteria crit = sessionFactory.getCurrentSession().createCriteria(KundeHibernateImpl.class);
		return crit.list();
	}
}
```

Noch eine Frage zu den Exceptions Spring wrappt ja die HibernateException, woher weiß ich was für Exception ich abfangen kann z.B. wenn der insert schief läuft gibts da ne Seite dafür?? 

Gruß


----------



## Noctarius (13. Dez 2009)

Die Exception von Spring abfragen, die Cause überprüfen ob Sie eine Instanz von HibernateException ist und wenn nicht Exception weiterwerfen.

Für sowas bietet sich immer gut eine Methode wie "handleHibernateException(Exception e)" an.


----------



## Gast2 (14. Dez 2009)

Noctarius hat gesagt.:


> Die Exception von Spring abfragen, die Cause überprüfen ob Sie eine Instanz von HibernateException ist und wenn nicht Exception weiterwerfen.
> 
> Für sowas bietet sich immer gut eine Methode wie "handleHibernateException(Exception e)" an.



Versteh ich jetzt nicht ganz was du meinst ^^... 
Beispiel ich lad ein Objekt und bekomm eine Hibernate ObjectNotFound Exception jetzt will ich dem User sagen bla bla error... aber ich will ja kein try catch in meiner UI von einer HibernateException...
so jetzt fang ich die exception ab und mache ein handleHibernateException aber da müsste ich ja keine ahung alle instanceOf mache damit ich weiß welche Exception ich habe...
Gibts doch bestimmt schon ein gescheites Konzept wie man die handelt...


----------



## Noctarius (14. Dez 2009)

Die Hibernate Exception wrapped die originale Exception also e.getCause(). Und dann musst du halt schauen was die Cause für eine Exception ist.


----------



## RaoulDuke (22. Dez 2009)

Moin,

der Grund warum das erste Beispiel nicht funktioniert, das 2. aber schon ist eigentlich ganz einfach. Im ersten Fall machst du keine Transaktion auf, das bedeutet, dass die Hibernate Session zu ist, sobald du dein Objekt zurück bekommst. Wenn du auf Werte zugreifst, die im Mapping auf lazy stehen, dann gibts die Exception, die wir da sehen, da das Proxyobjekt keine Session mehr hat um die Daten nachzuladen. In deinem JUnit Test hast du eine Annotation im Code die eine Transaktion öffnet, das sieht man ja auch in der Logausgabe. Da bleibt dann die Hibernate Session während der ganzen Methode offen, es der Proxy kann also bei Bedarf nachfetchen. 

Mich würde ja mal das Mapping deiner Klasse interessieren, dann so Felder wie Name und Id sollte man eigentlich nicht Lazy fetchen, das macht nur bei grösseren Feldern sinn, z.B. irgendwelchen Listen.

Sobald dein 'Kunde' den Bereich einer Hibernate Session verlässt nennt man es detached. Es ist auch kein simples Objekt der Klasse 'Kunde' wie du es eingetippt hast, sondern wurde von Hibernate mit einiger zusätzlich Funktionalität versehen, daher arbeitet es sich mit solchen Objekte nicht so einfach, man muss sich immer bewusst dein, dass Hibernate da noch dran hängt. Auf Felder die innerhalb der Session gefetched wurden kann man auch am detachten Objekt zugreifen, man kann ein geändertes Objekt auch wieder in einer Session reattachen, aber das ist nicht ganz ohne Fallstricke.


----------



## Gast2 (22. Dez 2009)

RaoulDuke hat gesagt.:


> Moin,
> 
> der Grund warum das erste Beispiel nicht funktioniert, das 2. aber schon ist eigentlich ganz einfach. Im ersten Fall machst du keine Transaktion auf, das bedeutet, dass die Hibernate Session zu ist, sobald du dein Objekt zurück bekommst. Wenn du auf Werte zugreifst, die im Mapping auf lazy stehen, dann gibts die Exception, die wir da sehen, da das Proxyobjekt keine Session mehr hat um die Daten nachzuladen. In deinem JUnit Test hast du eine Annotation im Code die eine Transaktion öffnet, das sieht man ja auch in der Logausgabe. Da bleibt dann die Hibernate Session während der ganzen Methode offen, es der Proxy kann also bei Bedarf nachfetchen.
> 
> ...



genau das heißt byte oben schon erklärt ???: ^^

Außerdem mach ich im 1. Fall eine Transaktion auf nur hab ich das Objekt außerhalb der Transaktion verwendet, dass war das Problem. Wenn ich es mit get hole und es dadurch detach ist gibt es keine Probleme...


----------

