我有一个@Entity
与:
@Entity
public class Issue implements Serializable
{
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
protected long id;
@ManyToOne
private IssueScope scope;
//getter/setter
}
我使用自定义
IssueScopeConverter
直接将IssueScope
与f:selectItems一起使用。转换器简单返回方法
getAsString
的ID为
IssueScope
返回一个新创建的对象getAsObject
(已设置ID)这不会对p:selectOneMenu以及类似代码的类似组件造成任何问题(并且在
@ManyToOne
之前使用了很多次):<h:form id="fScope">
<p:selectOneButton rendered="true" value="#{issueBean.issue.scope}"
converter="IssueScopeConverter">
<f:selectItems value="#{issueBean.issueScopes}" var="s"
itemLabel="#{s.name}" itemValue="#{s}"/>
</p:selectOneButton>
<p:commandButton value="Save" actionListener="#{issueBean.save()}"/>
</h:form>
现在让我们描述一下我的问题:实际上,我不需要
@ManyToOne
,我需要从@ManyToMany
到Issue
的IssueScope
关系:@ManyToMany(fetch=FetchType.EAGER)
private List<IssueScope> scopes;
XHTML将更改为:
<h:form id="fScopes">
<p:selectManyCheckbox value="#{issueBean.issue.scopes}"
converter="ErpIssueScopeConverter">
<f:selectItems value="#{issueBean.issueScopes}" var="s"
itemLabel="#{s.name}" itemValue="#{s}"/>
</p:selectManyCheckbox>
<p:commandButton value="Save" actionListener="#{issueBean.save()}"/>
</h:form>
如果我新创建了
Issue
,然后按“保存”按钮以保留该实体,则不会发生异常。即使选择的IssueScopes
也将保留。然后,如果我想更新实体,请在按下按钮后得到一个failed to lazily initialize a collection, no session or session was closed: org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed
。我的
public void save()
中的方法@Named @ViewScoped IssueBean
从未输入。该问题似乎与Lazy loading exception when using JSF Converter (refering to a collection)有关,但是我不使用Seam持久性或具有特殊的TransactionInterceptor`。
最佳答案
看看http://www.simtay.com/simple-crud-web-application-with-jsf-2-1-primefaces-3-5-maven-and-jpa/
看看是否有帮助。
最好的祝福
关于java - 具有@ManyToMany和自定义转换器的JSF和JPA:LazyInitializationException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13102834/