7

Каков наилучший способ обработки нескольких chackboxes, когда вы не заполняете отношение JPA M: N ... например, у меня есть объект JPA. Аппаратное обеспечение и сущность Connectivity.LazyInitializationException в selectManyCheckbox on @ManyToMany (fetch = LAZY)

Оборудование имеет набор для подключения:

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

и имеет и присваивателя как это:

@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; 
    } 

Я использую JSF2.2 и primefaces в графическом интерфейсе у меня есть 5,3:

<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> 

У меня проблема с ленивым исключением, даже если я звоню, чтобы заставить загрузить набор перед рендерингом t на его взгляд:

hardware.getConnectivities().size(); 

Любые предложения относительно того, как справиться с этой ситуацией?

Я использую все, чтобы преобразовать сущность.

Tnx to BalusC Мне удалось выполнить загрузку справа, но у меня все еще есть проблема с сохранением. Когда я выбираю опцию и отправить форму, я получаю ленивую исключение в преобразовании я думаю:

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) 

ответ

8

Вы должны принести его в то время как внутри транзакции (таким образом, внутри метода обслуживания), и не в то время как за пределами транзакция (таким образом, внутри, например, метод инициализации/действия JSF, управляемый bean-компонентом), который, таким образом, выдает LazyInitializationException.

Итак, ваша попытка

hardware.getConnectivities().size(); 

должно иметь место внутри транзакции. Создайте в случае необходимости новый метод службы с целью передачи объекта, который был получен ранее в другой транзакции.

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

Альтернативой было бы создать DTO для этой цели, которая имеет его жадно неправдоподобным.

А затем, чтобы сохранить выбранные элементы, убедитесь, что вы явно указать collectionType атрибут выбора компонентов в к стандартному типу Java, а не позволяя ему автоматически обнаруженным в JPA осущий специфический ленивый загруженный тип, такие как org.hibernate.collection.internal.PersistentSet в вашем конкретном случае. JSF нуждается в этом, чтобы создать экземпляр коллекции, прежде чем заполнять ее выбранными элементами.

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

См. Также org.hibernate.LazyInitializationException at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel.

+0

Я делаю, что внутри PostConstruct ИНП фасоли ViewScoped – simonC

+0

Как ответил, что не внутри транзакции. – BalusC

+0

Хорошо, и когда я пытаюсь сохранить, я также получаю ленивое исключение ... Каков правильный способ справиться с сохранением в таких ситуациях? – simonC

1

исправить это только specifie

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

Тогда вы уже были в транзакции, как указано в другом ответе – Kukeltje

Смежные вопросы