Spring/Hibernate exception

Status
Nicht offen für weitere Antworten.
G

Gast2

Gast
Hallo zusammen,

ich hätte nochmal ein paar fragen zu spring und hibernate zusammen...
wenn ich meine anwendung starte bekomme ich folgenden consolen log...
Java:
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
Java:
kunde = ServiceManager.getInstance().getKundenService().searchKundeById(Long.valueOf(1));
System.out.println(kunde.getName());

Java:
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
Java:
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...

Java:
@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
Java:
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
 
Zuletzt bearbeitet von einem Moderator:

Noctarius

Top Contributor
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]
 
G

Gast2

Gast
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

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
Code:
sessionFactory.load()
mach und er die id nicht findet schmeißt hibernat laut API eine exception... aber ich weiß nicht was spring damit macht ^^...
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
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>


<context:property-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

Top Contributor
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).
 
G

Gast2

Gast
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...
 
G

Gast2

Gast
Hm zu Hibernate pur weiß ich dann auch nicht :D (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...
 

byte

Top Contributor
Hi.

Auf den ersten Blick sieht die Konfig gut aus. Wie sieht denn die searchKundeById Methode aus? Lädst Du die evtl. mit
Code:
Session#load()
? Wenn ja, dann versuchs mal mit
Code:
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.
 
G

Gast2

Gast
Hi.

Auf den ersten Blick sieht die Konfig gut aus. Wie sieht denn die searchKundeById Methode aus? Lädst Du die evtl. mit
Code:
Session#load()
? Wenn ja, dann versuchs mal mit
Code:
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.


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
Java:
	@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);

Java:
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ß
 
Zuletzt bearbeitet von einem Moderator:

Noctarius

Top Contributor
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.
 
G

Gast2

Gast
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

Top Contributor
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

Bekanntes Mitglied
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.
 
G

Gast2

Gast
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.

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...
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Y Spring und Hibernate Application Tier 2
Y Maven MyFaces Hibernate Spring - Projekt Application Tier 1
M Spring DM: Problem mit Tomcat als OSGI-Service Application Tier 1
S Spring: Klassen in anderer "Anmelden" Application Tier 16
RaoulDuke Spring - Bugfixes in 2.5.x Application Tier 4
G Spring rollbackFor Application Tier 8
MQue Spring Security Form Application Tier 3
D Spring konfigurieren mit XML, Annotionen oder Java? Application Tier 2
MQue Spring in Zukunft Application Tier 5
I Passwort verschlüsseln in DB mit Spring Application Tier 5
MQue Spring https Application Tier 7
I Security bei Spring? Application Tier 31
MQue Spring beans Application Tier 10
I Wieviel Projekte bei Spring? Webprojekt Application Tier 2
G Transaktionen Spring Application Tier 58
K Spring DI existierendes Objekt übergeben Application Tier 2
G Spring applicationContext Application Tier 3
MQue Spring Autowired Application Tier 7
MQue Spring Proxys Application Tier 2
D Problem beim Testen von einer Spring-Anwendung Application Tier 8
MQue Spring BeanFactoryPostProcessor Application Tier 3
MQue Spring ApplicationContext Application Tier 20
S Spring util:list in eine andere importieren Application Tier 15
MQue Einsatz von Spring Application Tier 13
M Konfiguration WebApp/Spring Host-abhängig Application Tier 5
E Migration altes Framework (SOFIA) auf Spring Application Tier 3
D Automatische Typkonvertierung in Spring Application Tier 5
D Spring und Hbernate konfigurieren bzw. verschalten Application Tier 5
A Spring: JSP nimmt style.css nicht an Application Tier 3
G Spring Security Frage fuer Fortgeschrittene Application Tier 2
Y Spring + MyFaces - Exception bei Serverstart Application Tier 1
byte [Spring] Referenced Bean not found Application Tier 2
M Spring - Leichtgewichtiger als JBoss? Application Tier 4
D Spring: setter injection von statischer Methode? Application Tier 1
reibi Spring Beans - Grundsatzfrage Application Tier 3
thE_29 Spring und XFire Frage Application Tier 3
H spring Application Tier 2
R Spring und Hibernate3 - CGLib Enhancement failed Application Tier 2
S Spring 2.0 Tutorial gesucht Application Tier 2
M JBoss Seam - Spring Application Tier 11
G [Spring+JSF]: VariableResolver und Scopes? Application Tier 1
C Hibernate Select mit Join in JSP darstellen Application Tier 0
N Problem Dependency Injection im Kreis Hibernate Listener Application Tier 4
N /hibernate.cfg.xml not found Application Tier 2
D Lazy Hibernate bei 3-Tier Applikation (JBoss + EJB3 + FatClient) Application Tier 6
byte Wie prüfen, ob Hibernate Collection initialisiert? Application Tier 6
T Tomcat 6: JSP-Exception beinhaltet nicht den wahren Ursprungsort Application Tier 4
S exception: Could not create stateless EJB StatelessEJB Application Tier 1

Ähnliche Java Themen

Neue Themen


Oben