我有一个@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,我需要从@ManyToManyIssueIssueScope关系:

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

10-11 08:40