2015-05-07 24 views
7

JPA M: N ilişkisini doldurmaya çalışırken birden çok chackbox'ı işlemenin en iyi yolu nedir? Örneğin, bir JPA varlığım var Donanım ve varlık Bağlantı.LazMInitializationException selectManyCheckbox on @ManyToMany (fetch = LAZY)

Donanım bağlantı için bir kümesi vardır:

private Set<Connectivity> connectivities = new HashSet<Connectivity>(0); 

ve bir ayarlayıcı vardır ve bunun gibi getter:

@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.REFRESH }, mappedBy = "hwProviders") 
    public Set<Connectivity> getConnectivities() { 
     return this.connectivities; 
    } 

    public void setConnectivities(Set<Connectivity> connectivities) { 
     this.connectivities = connectivities; 
    } 

Ben JSF2.2 kullanıyorum ve sahip Arabirimdeki 5.3 primefaces:

<p:selectManyCheckbox id="connectivity" value="#{hardware.connectivities}" converter="omnifaces.SelectItemsConverter" layout="pageDirection"> 
    <f:selectItems value="#{connectivityes}" var="connect" itemValue="#{connect}" itemLabel="#{connect.name}"/> 
</p:selectManyCheckbox> 

ben zorlamak için bir çağrı t render önce kümesi yükleyen yapmak bile tembel hariç sorun var görünüm:

hardware.getConnectivities().size(); 

Bu durumun nasıl ele alınacağı konusunda herhangi bir itirazınız var mı?

Varlık dönüştürmeyi yapmak için çok amaçlı kullanıyorum.

BalusC'den Tnx Yüklemeyi doğru yapmayı başardım ancak yine de sorun giderme konusunda sorun yaşıyorum. Ben onay kutusunu işaretleyin ve dönüşümle tembel istisna olsun formu göndermek zaman düşünüyorum:

16:34:50,538 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (default task-12) org.hibernate.LazyInitializationException: failed to lazily initialize a collection, could not initialize proxy - no Session 
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:575) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:214) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:554) 
    at org.hibernate.collection.internal.PersistentSet.add(PersistentSet.java:202) 
    at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel(MenuRenderer.java:381) 
    at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValue(MenuRenderer.java:128) 
    at com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:314) 
    at org.primefaces.component.selectmanycheckbox.SelectManyCheckboxRenderer.getConvertedValue(SelectManyCheckboxRenderer.java:39) 
    at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1045) 
    at javax.faces.component.UIInput.validate(UIInput.java:975) 
    at javax.faces.component.UIInput.executeValidate(UIInput.java:1248) 
    at javax.faces.component.UIInput.processValidators(UIInput.java:712) 
    at javax.faces.component.UIForm.processValidators(UIForm.java:253) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1260) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1260) 
    at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1195) 
    at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646) 
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130) 
    at si.arctur.filter.SessionFilter.doFilter(SessionFilter.java:76) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) 
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) 
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) 
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) 
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) 
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) 
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63) 
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) 
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) 
    at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261) 
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247) 
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76) 
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:166) 
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:197) 
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

cevap

8

Bunu getirmesi gerekir iken (hizmet yöntemi içinde böylece) işlem ve içinde değil dışarıda iken bir işlem (böylece, örneğin, JSF tarafından yönetilen fasulye init/eylem yöntemi), böylece bir LazyInitializationException. Yani

senin girişimi

hardware.getConnectivities().size(); 

bir hareket içinde yer almak zorundadır. Gerekirse, başka bir işlemde daha önce elde edilmiş olan varlığı geçtiğiniz amaç için yeni bir hizmet yöntemi oluşturun.

hardwareService.fetchConnectivities(hardware); 
public void fetchConnectivities(Hardware hardware) { 
    hardware.setConnectivities(em.merge(hardware).getConnectivities()); // Becomes managed. 
    hardware.getConnectivities().size(); // Triggers lazy initialization. 
} 

alternatif o hevesle getirilen sahiptir amaçla bir DTO oluşturmak olacaktır.

Ve sonra, seçili öğeleri kaydetmek açıkça böyle özel durumlarda org.hibernate.collection.internal.PersistentSet olarak JPA impl belirli tembel yüklenen tipini otomatik bulma icar yerine standart bir Java türüne seçim bileşenin collectionType niteliğini belirtmek emin olmak için. JSF, koleksiyonunu seçilen öğelerle doldurmadan önce örneklendirmek için buna ihtiyaç duyar.

<p:selectManyCheckbox ... collectionType="java.util.LinkedHashSet"> 

Ayrıca bkz. org.hibernate.LazyInitializationException at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel.

+0

Ben – simonC

+0

şöyle cevap verdi ViewScoped cdi fasulye PostConstruct içinde bir hareket içinde olmadığını yapıyorum bunu düzeltin. – BalusC

+0

Tamam ve kurtarmaya çalıştığımda da tembel bir istisna alıyorum ... bu durumlarda tasarruf etmenin uygun yolu nedir? – simonC

1

Sadece specifie

<f:attribute name="collectionType" value="java.util.LinkedHashSet" /> 
+0

Öyleyse, diğer cevapta bahsedildiği gibi zaten bir işlemin içindesiniz – Kukeltje