Hi,
ich habe ein Lazy Loading Problem. Bisher habe ich es mit fetchType=EAGER umgangen, aber das soll keine Dauerlösung sein.
Hier ein konstrutiertes Example. Es macht nicht sonderlich viel Sinn, zeigt aber mein Problem:
Eine Company hat mehrere Personen. Personen sind über Komposition @OneToMany in der Company enthalten.
Wenn ich auf die Personenliste aus JSF zugreife, bekomme ich diese Exception:
tablePersons.xhtml:
Die Backing Facaden:
CRUD Service:
Entity:
Ich habe bereits den OpenEntityManager für Spring configuriert:
web.xml:
[XML] <filter>
<filter-name>OpenEntityManagerInViewFilter</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
<init-param>
<param-name>entityManagerFactoryBeanName</param-name>
<param-value>entityManagerFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>OpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
[/XML]
Dennoch funktioniert es nicht.
Danke für jede hilfreiche Idee!
ich habe ein Lazy Loading Problem. Bisher habe ich es mit fetchType=EAGER umgangen, aber das soll keine Dauerlösung sein.
Hier ein konstrutiertes Example. Es macht nicht sonderlich viel Sinn, zeigt aber mein Problem:
Eine Company hat mehrere Personen. Personen sind über Komposition @OneToMany in der Company enthalten.
Wenn ich auf die Personenliste aus JSF zugreife, bekomme ich diese Exception:
Java:
Schwerwiegend [javax.enterprise.resource.webcontainer.jsf.context] (http--127.0.0.1-8080-4) javax.el.ELException: /tablePersons.xhtml @31,76 value=" #{calculator.getPersonCount(_var)}":
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: business.domain.Company.personList, no session or session was closed
tablePersons.xhtml:
Java:
<p:dataTable var="_var" value="#{facade.persons}">
<p:column>
<h:outputText value="#{calculator.getPersonCount(_var)}" />
Die Backing Facaden:
Java:
@Named
@RequestScoped
class Facade() {
@Inject
Dao dao;
List<Company> companies;
@PostConstruct
init() {
companies = Dao.findByNamedQuery("Companies.ALL");
}
}
@Named
@RequestScoped
class Calculator {
int getPersonCount(Company c) {
return c.getPersonList().size(); //EX
}
}
Java:
@Stateless
@Transactional
class Dao() {
@PersistenceContext
private EntityManager em;
//CRUD
}
Entity:
Java:
@Entity
@NamedQueries( {
@NamedQuery(name = Company.ALL",
query = "SELECT c FROM Company c")
})
class Company {
@OneToMany(cascade = CascadeType.ALL) // fetch=FetchType.EAGER <-damit funktioniert alles problemlos
List<Person> personList = new LinkedList<Person>();
}
Ich habe bereits den OpenEntityManager für Spring configuriert:
web.xml:
[XML] <filter>
<filter-name>OpenEntityManagerInViewFilter</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
<init-param>
<param-name>entityManagerFactoryBeanName</param-name>
<param-value>entityManagerFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>OpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
[/XML]
Dennoch funktioniert es nicht.
Danke für jede hilfreiche Idee!
Zuletzt bearbeitet: