[Hibernate, Webanwendung] Lazy Fetching

Kiloui

Mitglied
Hey,
ich arbeite derzeit mit Hibernate um meine Persistenzschicht zu implmenetieren.

In meinem Projekt existiert eine Klasse "Mitarbeiter" welche ich in der Regel via Lazy Fetch aus der Datenbank auslese.

Nun bin ich an dem Punkt wo ich bestimmte Mitarbeiter vollständig (quasi eine tiefe Kopie der Mitarbeiter Objekte) benötige (einige der Attribute der Mitarbeiter sind Objekte und keine primitiven Datentypen).

In meiner applicationContext.xml stehen unter Anderem die folgenden Zeilen:

Code:
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="search*" read-only="true" propagation="REQUIRED" />
			<tx:method name="getSearch*" read-only="true" propagation="REQUIRED" />
			<tx:method name="get*" read-only="true" propagation="REQUIRED" />
			<tx:method name="insert*" read-only="false" propagation="REQUIRED" />
			<tx:method name="update*" read-only="false" propagation="REQUIRED" />
			<tx:method name="delete*" read-only="false" propagation="REQUIRED" />
			<tx:method name="save*" read-only="false" propagation="REQUIRED" />
			<tx:method name="add*" read-only="false" propagation="REQUIRED" />
			<tx:method name="*" read-only="false" />
		</tx:attributes>
	</tx:advice>
  
	<aop:aspectj-autoproxy />
  
	<aop:config>
		<aop:pointcut id="skillServiceOperation"
			expression="execution(* com.presentation..*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="skillServiceOperation" />
	</aop:config>


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


Hierdurch bliebt die Session innerhalb einzelner Funktionen offen und ich kann mir eine "tiefe Kopie" der Mitarbeiter Objekte aus der Datenbank holen. Die Funktion hierfür sieht wie folgt aus:

Code:
	public Employee getEmployee(long id) {
		Employee employee = hibernateTemplate.get(Employee.class, id);

		System.out.println(employee.getApps());
		
		System.out.println(employee.getCarreer());
				
		return employee;
}

Die Attribute "Apps" und "Carreer" der Mitarbeiter sind Objekte und wenn ich die offene Session innerhalb der Funktion "getEmploye" nutze nutze um diese Attribute zumindest einmal aufgerufen zu haben und ich außerhalb der Funktion versuche an die Attribute zu kommen dann bekommen ich ne Exception dass keine Session vorhanden ist oder bereits geschlossen wurde.

Was muss ich tun um an beliebiger Stelle auf die Attribute zugreifen zu können ? Ich denke mal das ist Sinn des lazy fetching ****? lazy="false" zu setzen ist übrigens keine Lösung für mich ;)

Hier noch ein auszug aus der Employee.hbm.xml:

Code:
<set name="apps" table="APPS" cascade="save-update" inverse="false" lazy="true" fetch="select">
            <key>
                <column name="EMPLOYEE_ID" />
            </key>
            <one-to-many class="com.model.Apps" />
        </set>
 
Zurück