我有一个@Entity
:
@Entity
public class Issue implements Serializable
{
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
protected long id;
@ManyToOne
private IssueScope scope;
//getter/setter
}
我使用自定义IssueScopeConverter
直接使用IssueScope
with f:selectItems。转换器简单
- 返回方法的id
getAsString
- 返回一个新创建的对象
IssueScope
(带有id集)getAsObject
对于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>
现在让我们描述一下我的问题:实际上我不需要 a @ManyToOne
,我需要一个@ManyToMany
关系 from Issue
to 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
然后按下Save按钮来持久化实体,这将毫无例外地完成。即使选择了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
从来没有输入过。
问题似乎与使用 JSF 转换器时的延迟加载异常有关(引用集合),但我不使用 Seam 持久性或具有特殊类型的 TransactionInterceptor`。