JSF Lazy Listen nachladen?

membersound

Bekanntes Mitglied
Hallo,

wie kann ich möglichst simpel eine LAZY Liste nachladen? Außer sie eager zu definieren?
Irgendwie müsste ich es eben erreichen, dass die Payments immer genau dann nachgeladen werden, wenn sie eben gebraucht werden.

Java:
@Entitiy
public class Person {
	@OneToMany //(fetch=FetchType.EAGER)
	private List payments;
//..
}

@Named
public class Service {
	private persons;
//..
}

[XML]<h:dataTable var="p" value="#{service.persons}>
<h:column headerText="Anzahl Payments">
<h:eek:utputText value="#{p.payments}"/> //exception wegen lazy
</h:column>
</h:dataTable>
[/XML]
Danke
 

musiKk

Top Contributor
Google mal nach "jpa open session in view". Das ist ein häufig auftretendes Problem. Bei StackOverflow gibt es auch einige Fragen, die sich damit beschäftigen (z. B. diese inklusive weiterführender Links).
 

membersound

Bekanntes Mitglied
Also das einfachste scheint ja zu sein den OpenEntityManagerInViewFilter von Spring zu nutzen.
Habe also versucht das ganze mal zu implementieren. Die webapp läuft wieder wie vorher (dh das mit Spring scheint geklappt zu haben). Das LAZY Problem besteht aber weiterhin.

Muss ich denn noch was anderes machen, als die Configuration mit xml?
Vielleicht findet ja jemand noch einen Fehler?

Code:
[javax.enterprise.resource.webcontainer.jsf.context] (http--127.0.0.1-8080-1) 
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: 
domain.person.payments, no session or session was closed

Mein Setup:
Java:
@Entity
class Payments;

@Entity
class Person {
  @OneToMany
   list payments;
}

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
class Service {
  @PersistenceContext
  EntityManager em;
}

@Named
@RequestScoped
class CustomerFacade {
  @Inject
  Service service;
}

in der web.xml:
[XML]<filter>
<filter-name>
OpenEntityManagerInViewFilter
</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>flushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
</filter>
<!-- Include this if you are using Hibernate -->
<filter-mapping>
<filter-name>OpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- Spring config -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
[/XML]

applicationContext.xml:
[XML]<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.transaction.manager_lookup_class">
org.hibernate.transaction.JBossTransactionManagerLookup
</prop>
</props>
</property>
</bean>[/XML]

persistence.xml:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
Java Persistence API: XML Schemas
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="primary">
<!-- If you are running in a production environment, add a managed
data source, the example data source is just for proofs of concept! -->
<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
<properties>
<!-- Properties for Hibernate -->
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="hibernate.show_sql" value="false" />
</properties>
</persistence-unit>
</persistence>
[/XML]

danke
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben