0

我有一个@Entity

@Entity
public class Issue implements Serializable
{
  @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
 protected long id; 

 @ManyToOne
 private IssueScope scope;

  //getter/setter
}

我使用自定义IssueScopeConverter直接使用IssueScopewith f:selectItems。转换器简单

  • 返回方法的idgetAsString
  • 返回一个新创建的对象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 Issueto 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`。

4

1 回答 1

1

看看http://www.simtay.com/simple-crud-web-application-with-jsf-2-1-primefaces-3-5-maven-and-jpa/

看看有没有帮助。

此致

于 2013-03-22T16:46:01.760 回答