]
Emmanuel Bernard resolved EJBTHREE-479.
---------------------------------------
Resolution: Rejected
no user feedback
org.hibernate.HibernateException: CGLIB Enhancement failed
----------------------------------------------------------
Key: EJBTHREE-479
URL:
http://jira.jboss.com/jira/browse/EJBTHREE-479
Project: EJB 3.0
Issue Type: Bug
Affects Versions: EJB 3.0 RC5 - PFD
Environment: Java 5_6, EJB3RC5, JBoss 4.0.4RC1, Ingres3.0.3, PostgreSQL 8.1.3
Reporter: Stefan Lindner
Bean A is referenced by Bean B (Lazy)
Bean B is Referenced By Bean C (Lazy)
Now query for Bean C fails with
java.lang.Exception: java.lang.Exception: org.hibernate.LazyInitializationException:
could not initialize proxy - no Session
java.lang.Exception: java.lang.Exception: java.lang.Exception:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
If I change the @FetchType to eager it works.
But in Detail.
--- Start of BeanA (OrganisationBean)
-------------------------------------------------------------------------------------------------------------------
package de.visiomedic.organisationsstruktur;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.persistence.Id;
import javax.persistence.Column;
import javax.persistence.NamedQuery;
import javax.persistence.NamedQueries;
@Entity()
@Inheritance(strategy=InheritanceType.JOINED)
@NamedQueries( {
@NamedQuery (
name="OrganisationBean.FindByName",
query="SELECT entity FROM OrganisationBean entity WHERE entity.name =
:name" ) ,
@NamedQuery (
name="OrganisationBean.FindAll",
query="SELECT entity FROM OrganisationBean entity" )
}
)
@Table(name = "organisation", uniqueConstraints={
@UniqueConstraint(columnNames={"id"}),
@UniqueConstraint(columnNames={"name"})})
public class OrganisationBean implements java.io.Serializable {
public static final long serialVersionUID = 1L;
public static final String SEQUENCE_NAME = "organisation_sequence";
public static final String defaultOrganisationForTest = "Messe";
// [[ Constructors ###########################################################
OrganisationBean() {
;
}
OrganisationBean(String id, String name) throws Exception {
this.setId(id);
this.setName(name);
}
// ]] Constructors ###########################################################
// [[ Component Interface ####################################################
// [[ id .....................................................................
private String id;
@Id
@Column(
name="id",
unique=true,
nullable=false,
updatable=false,
length=12,
columnDefinition="varchar(12)"
)
public String getId() {
return id;
}
void setId(String id) {
this.id = id;
}
// ]] id
// [[ name ...................................................................
private String name;
@Column(
name="name",
unique=true,
nullable=false,
updatable=true,
length=100,
columnDefinition="varchar(200)"
)
public String getName() {
return this.name;
}
public void setName(String name) throws Exception {
if (name == null)
throw new Exception("OrganisationBean.setName(null): null value for
'name' not allowed");
this.name = name;
}
// ]] name
// ]] Component interface ####################################################
// [[ Business Interface #####################################################
public String toString() {
return "OrganisationBean: id = " + _toString(this.id) + ", name = "
+ _toString(this.name);
}
// ]] Business Interface #####################################################
}
--- End of BeanA (OrganisationBean)
--------------------------------------------------------------------------------------------------------------------
--- Start of BeanB (SiteBean)
-------------------------------------------------------------------------------------------------------------------
package de.visiomedic.organisationsstruktur;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import de.visiomedic.organisationsstruktur.OrganisationBean;
@Entity()
@NamedQueries( {
@NamedQuery (
name="SiteBean.FindAllForOrganisation",
query="SELECT entity FROM SiteBean entity where entity.organisation =
:organisation" ),
@NamedQuery (
name="SiteBean.FindByNameForOrganisation",
query="SELECT entity FROM SiteBean entity where entity.name = :name AND
entity.organisation = :organisation" )
}
)
@Table(name = "site", uniqueConstraints={
@UniqueConstraint(columnNames={"id"}),
@UniqueConstraint(columnNames={"organisation", "name"})})
public class SiteBean implements java.io.Serializable {
public static final long serialVersionUID = 1L;
public static final String SEQUENCE_NAME = "site_sequence";
public static final String defaultSiteForTest = "Medica";
// [[ Constructors ###########################################################
SiteBean() {
;
}
SiteBean(final String id, final OrganisationBean organisation, final String name) throws
Exception {
this.setId(id);
this.setName(name);
this.setOrganisation(organisation);
}
// ]] Constructors ###########################################################
// [[ Component Interface ####################################################
// [[ id .....................................................................
private String id;
@Id
@Column(
name="id",
unique=true,
nullable=false,
updatable=false,
length=12,
columnDefinition="varchar(12)"
)
public String getId() {
return id;
}
void setId(String id) {
this.id = id;
}
// ]] id
// [[ name ...................................................................
private String name;
@Column(
name="name",
unique=true,
nullable=false,
updatable=true,
length=50,
columnDefinition="varchar(100)"
)
public String getName() {
return name;
}
void setName(String name) {
this.name = name;
}
// ]] name
// [[ organisation ...........................................................
private OrganisationBean organisation;
@ManyToOne(
// cascade=CascadeType.ALL,
fetch=FetchType.LAZY,
optional=true
)
@JoinColumn(
name="organisation",
nullable=false
)
public OrganisationBean getOrganisation() {
return organisation;
}
void setOrganisation(OrganisationBean organisation) {
this.organisation = organisation;
}
// ]] organisation
// ]] Component interface ####################################################
// [[ Business Interface #####################################################
public String toString() {
String s = "SiteBean: id = " + this.id;
s += ", name = " + _toString(this.name);
s += ", organisation = " + _toString(this.organisation.toString());
return s;
}
// ]] Business Interface #####################################################
}
--- End of BeanB (SiteBean)
--------------------------------------------------------------------------------------------------------------------
--- Start of BeanC (PersonBelongsToSiteBean)
-------------------------------------------------------------------------------------------------------------------
package de.visiomedic.personen;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import de.visiomedic.organisationsstruktur.SiteBean;
@Entity()
@NamedQueries( {
@NamedQuery (
name="PersonBelongsToSiteBean.FindAllForOrganisation",
query="SELECT entity FROM PersonBelongsToSiteBeanentity where
entity.site.organisation = :organisation" ),
@NamedQuery (
name="PersonBelongsToSiteBean.FindPersonAllForSite",
query="SELECT entity.person FROM PersonBelongsToSiteBeanentity where entity.site
= :site" ),
@NamedQuery (
name="PersonBelongsToSiteBean.FindBySiteAndPerson",
query="SELECT entity FROM PersonBelongsToSiteBeanentity where entity.site =
:site AND entity.person = :person" ),
@NamedQuery (
name="PersonBelongsToSiteBean.FindSiteAllForPerson",
query="SELECT entity.site FROM PersonBelongsToSiteBeanentity where entity.person
= :person" )
}
)
@Table(name = "persongehoertzusite", uniqueConstraints={
@UniqueConstraint(columnNames={"id"}),
@UniqueConstraint(columnNames={"person", "site"})})
public class PersonBelongsToSiteBean implements java.io.Serializable {
public static final long serialVersionUID = 1L;
public static final String SEQUENCE_NAME = "persongehoertzusite_sequence";
// [[ Constructors ###########################################################
PersonGehörtZuSiteBean() {
;
}
PersonGehörtZuSiteBean(final String id,
final SiteBean site, final PersonBean person,
boolean organisationsAdministrator,
boolean siteAdministrator) throws Exception {
this.setId(id);
this.setSite(site);
this.setPerson(person);
this.setOrganisationsAdministrator(organisationsAdministrator);
this.setSiteAdministrator(siteAdministrator);
}
// ]] Constructors ###########################################################
// [[ Component Interface ####################################################
// [[ id .....................................................................
private String id;
@Id
@Column(
name="id",
unique=true,
nullable=false,
updatable=false,
length=12,
columnDefinition="varchar(12)"
)
public String getId() {
return id;
}
void setId(String id) {
this.id = id;
}
// ]] id
// [[ site ...................................................................
private SiteBean site;
@ManyToOne(
// cascade=CascadeType.ALL,
fetch=FetchType.EAGER,
optional=false
)
@JoinColumn(
name="site",
nullable=false
)
public SiteBean getSite() {
return site;
}
void setSite(SiteBean site) {
this.site = site;
}
// ]] site
// [[ person .................................................................
private PersonBean person;
@ManyToOne(
// cascade=CascadeType.ALL,
fetch=FetchType.EAGER,
optional=false
)
@JoinColumn(
name="person",
nullable=false
)
public PersonBean getPerson() {
return person;
}
void setPerson(PersonBean person) {
this.person = person;
}
// ]] person
// [[ siteAdministrator ......................................................
private boolean siteAdministrator;
@Column(
name="siteAdministrator",
nullable=false,
updatable=true,
columnDefinition="int1"
)
public boolean getSiteAdministrator() {
return siteAdministrator;
}
void setSiteAdministrator(boolean siteAdministrator) {
this.siteAdministrator = siteAdministrator;
}
// ]] siteAdministrator
// [[ organisationsAdministrator .............................................
private boolean organisationsAdministrator;
@Column(
name="organisationsAdministrator",
nullable=false,
updatable=true,
columnDefinition="int1"
)
public boolean getOrganisationsAdministrator() {
return organisationsAdministrator;
}
void setOrganisationsAdministrator(boolean organisationsAdministrator) {
this.organisationsAdministrator = organisationsAdministrator;
}
// ]] organisationsAdministrator
// ]] Component interface ####################################################
}
--- End of BeanC (personBelongsToSiteBean)
--------------------------------------------------------------------------------------------------------------------
Now I Try the following
Query query =
manager.createNamedQuery("PersonBelongsToSiteBean.FindBySiteAndPerson");
query = query.setParameter("site", site);
query = query.setParameter("person", person);
List l = query.getResultList();
This fails with the above error message.
If I change the @FetchType from LAZY to EAGER in Bean B (SiteBean) it works.
The @FetchType.LAZY annotatiion seems to work fine when the referenced bean does not
reference other beans lazily.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: