Hello!
I have a simple Domain model. "Dienst" has a property "Benutzer".
When I map the entities with annotations, the "benutzer" property is always fetched eagerly.
When I map the entities with the provided hbm.xml file I get my expected LazyLoadingException
I think I miss something trivial, as I've not found anything in the forums, docus, or books.
as it states here (
http://www.hibernate.org/250.html#A18 ) that by default fetching strategy is set to lazy.
Any help is appreciated,
thx in advance & kind regards
b]Hibernate version:[/b]
hibernate-core: 3.3.1.GA or hibernate 3.2.6 when loading the dependency transient
hibernate-annotations: 3.3.1.GA
Mapping documents:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.company.app.types.impl.Dienst" table="tblDienst">
<id name="id" column="DienstId" />
<property name="beginn" column="DienstBeginn"/>
<many-to-one name="benutzer" column="BenutzerId"></many-to-one>
</class>
</hibernate-mapping>
Code:
package com.company.app.types.impl;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Table(name="tblDienst")
@Entity
public class Dienst implements com.company.app.types.Dienst {
private String id;
private Date beginn;
private Date ende;
private String benutzerId;
private Benutzer benutzer;
@Id
@Column(name="DienstId")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@ManyToOne
@JoinColumn(name="BenutzerId")
public Benutzer getBenutzer() {
return benutzer;
}
public void setBenutzer(Benutzer benutzer) {
this.benutzer = benutzer;
}
@Column(name="DienstBeginn")
public Date getBeginn() {
return beginn;
}
public void setBeginn(Date beginn) {
this.beginn = beginn;
}
@Column(name="BenutzerId", insertable=false, updatable=false)
public String getBenutzerId() {
return benutzerId;
}
public void setBenutzerId(String benutzerId) {
this.benutzerId = benutzerId;
}
@Column(name="DienstEnde")
public Date getEnde() {
return ende;
}
public void setEnde(Date ende) {
this.ende = ende;
}
}
Code between sessionFactory.openSession() and session.close():Code:
Session session = dataAccess.getSessionFactory().openSession();
Query query = session.createQuery("from Dienst d where d.id = ?");
query.setParameter(0, dienstIds[0]);
Dienst loadedD = (Dienst) query.uniqueResult();
session.close();
try{
loadedD.getBenutzer().getLogin();
Assert.fail();
} catch(LazyInitializationException lie)
{
} catch(Exception e)
{
Assert.fail();
}
Name and version of the database you are using:
org.hsqldb.jdbcDriver and MS SQL Servier 2000
The generated SQL (show_sql=true):
select dienst0_.DienstId as DienstId2_, dienst0_.DienstBeginn as DienstBe2_2_, dienst0_.BenutzerId as BenutzerId2_, dienst0_.DienstEnde as DienstEnde2_ from tblDienst dienst0_ where dienst0_.DienstId=?
select benutzer0_.BenutzerId as BenutzerId1_1_, benutzer0_.BenutzerGebDatum as Benutzer2_1_1_, benutzer0_.BenutzerKFZKennzeichen as Benutzer3_1_1_, benutzer0_.BenutzerLogin as Benutzer4_1_1_, benutzer0_.MandantenId as Mandante7_1_1_, benutzer0_.BenutzerMitarbeiterNr as Benutzer5_1_1_, benutzer0_.BenutzerPasswort as Benutzer6_1_1_, mandant1_.MandantenId as Mandante1_0_0_, mandant1_.Login as Login0_0_, mandant1_.Name as Name0_0_, mandant1_.Passwort as Passwort0_0_ from tblBenutzer benutzer0_ left outer join tblMandant mandant1_ on benutzer0_.MandantenId=mandant1_.MandantenId where benutzer0_.BenutzerId=?