相关疑难解决方法(0)

为什么JSF多次调用getter

假设我像这样指定一个outputText组件:

<h:outputText value="#{ManagedBean.someProperty}"/>
Run Code Online (Sandbox Code Playgroud)

如果我在someProperty调用getter for时打印一条日志消息并加载页面,那么注意每个请求多次调用getter是很容易的(在我的情况下发生了两次或三次):

DEBUG 2010-01-18 23:31:40,104 (ManagedBean.java:13) - Getting some property
DEBUG 2010-01-18 23:31:40,104 (ManagedBean.java:13) - Getting some property
Run Code Online (Sandbox Code Playgroud)

如果someProperty计算的值很昂贵,这可能是一个问题.

我用Google搜索了一下,认为这是一个已知问题.一个解决方法是包括一个检查,看看它是否已经计算过:

private String someProperty;

public String getSomeProperty() {
    if (this.someProperty == null) {
        this.someProperty = this.calculatePropertyValue();
    }
    return this.someProperty;
}
Run Code Online (Sandbox Code Playgroud)

这个问题的主要问题是你得到大量的样板代码,更不用说你可能不需要的私有变量了.

这种方法有哪些替代方案?没有那么多不必要的代码,有没有办法实现这一目标?有没有办法阻止JSF以这种方式行事?

感谢您的输入!

getter performance jsf el

253
推荐指数
4
解决办法
9万
查看次数

什么是Hibernate中的延迟加载?

什么是Java中的延迟加载?我不明白这个过程.任何人都可以帮我理解延迟加载的过程吗?

java orm hibernate lazy-loading

170
推荐指数
8
解决办法
25万
查看次数

为什么Hibernate Open Session in View被认为是一种不好的做法?

您使用什么样的替代策略来避免LazyLoadExceptions?

我确实理解在视图中打开会话有以下问题:

  • 分层应用程序在不同的jvm中运行
  • 事务只在最后提交,很可能你以前想要结果.

但是,如果您知道您的应用程序在单个虚拟机上运行,​​为什么不通过在视图策略中使用开放会话来减轻您的痛苦?

java hibernate jpa lazy-loading open-session-in-view

104
推荐指数
5
解决办法
6万
查看次数

如何在使用JPA和Hibernate时解决LazyInitializationException

我正在为一个想要使用延迟初始化的客户开发一个项目.当使用默认延迟加载模式映射类时,它们总是会出现"延迟初始化异常".

@JoinTable(name = "join_profilo_funzionalita", joinColumns = {@JoinColumn(name =    "profilo_id", referencedColumnName = "profilo_id")}, inverseJoinColumns = {@JoinColumn(name = "funzionalita_id", referencedColumnName = "funzionalita_id")})
//@ManyToMany(fetch=FetchType.EAGER) - no exceptions if uncommented
@ManyToMany 
private Collection<Funzionalita> funzionalitaIdCollection;
Run Code Online (Sandbox Code Playgroud)

是否有使用JPA类的标准模式来避免此错误?

欢迎使用片段,非常感谢您的时间.

java orm hibernate jpa lazy-initialization

50
推荐指数
6
解决办法
7万
查看次数

何时需要或方便地将Spring或EJB3或它们全部一起使用?

混淆使用JSF2 + Spring + EJB3或它们的任意组合让我感到有些困惑.我知道Spring的一个主要特性是依赖注入,但是我可以使用JSF托管bean @ManagedBean@ManagedPropertyanotations,并获得依赖注入功能.使用EJB3,我更加困惑何时将其与JSF一起使用,或者甚至有理由使用它.

那么,在什么样的情况下使用Spring + JSF2或EJB3 + JSF2是个好主意?

到目前为止,我只使用JSF2创建了一些小型Web应用程序,从不需要使用Spring或EJB3.但是,我在许多地方看到人们正在将所有这些东西放在一起.

jsf spring ejb java-ee service-layer

39
推荐指数
2
解决办法
9689
查看次数

通过无知解决LazyInitializationException

这里有无数的问题,如何解决"无法初始化代理"问题,通过急切提取,保持交易开放,打开另一个OpenEntityManagerInViewFilter,等等.

但是,是否可以简单地告诉Hibernate忽略该问题并假装该集合为空?在我的情况下,不提取它只是意味着我不在乎.

这实际上是以下Y的XY问题:

我正在上课

class Detail {
    @ManyToOne(optional=false) Master master;
    ...
}

class Master {
    @OneToMany(mappedBy="master") List<Detail> details;
    ...
}
Run Code Online (Sandbox Code Playgroud)

并且想要提供两种请求:一个返回一个master包含所有的请求details,另一个返回一个包含masters 的列表details.结果将由Gson转换为JSON.

我试过session.clearsession.evict(master),但他们不碰代替使用的代理服务器details.有用的是

 master.setDetails(nullOrSomeCollection)
Run Code Online (Sandbox Code Playgroud)

感觉相当hacky.我更喜欢"无知",因为它通常适用而不知道代理的哪些部分.

写一个Gson TypeAdapter忽略AbstractPersistentCollectionwith的实例initialized=false可能是一种方式,但这取决于org.hibernate.collection.internal,这肯定没有好处.捕获异常TypeAdapter并不会听起来好多了.

一些答案后更新

我的目标不是" 加载数据而不是异常",而是 "如何获取null而不是异常"

Dragan提出了一个有效的观点,即忘记获取和返回错误的数据会比异常更糟糕.但有一个简单的方法:

  • 仅为收集执行此操作
  • 从来没有用过null他们
  • 返回null而不是空集合作为未获取数据的指示

这样,结果永远不会被错误地解释.如果我忘记取一些东西,响应将包含null哪些无效.

java orm hibernate jpa hibernate-mapping

16
推荐指数
1
解决办法
1154
查看次数

com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel上的org.hibernate.LazyInitializationException

尽管FetchType.EAGERJOIN FETCH,我得到一个LazyInitalizationException,同时增加一些对象,以一个@ManyToMany通过收集JSF UISelectMany组件,如我的情况<p:selectManyMenu>.

@Entity IdentUser,有FetchType.EAGER:

@Column(name = "EMPLOYERS")
@ManyToMany(fetch = FetchType.EAGER, cascade= CascadeType.ALL)
@JoinTable(name = "USER_COMPANY", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "COMPANY_ID") })
private Set<Company> employers = new HashSet<Company>();
Run Code Online (Sandbox Code Playgroud)

@Entity Company,有FetchType.EAGER:

@ManyToMany(mappedBy="employers", fetch=FetchType.EAGER)
private List<IdentUser> employee;
Run Code Online (Sandbox Code Playgroud)

JPQL,包含JOIN FETCH:

public List<IdentUser> getAllUsers() {
    return this.em.createQuery("from IdentUser u LEFT JOIN FETCH u.employers WHERE u.enabled …
Run Code Online (Sandbox Code Playgroud)

jsf jpa lazy-loading eager-loading selectmanymenu

14
推荐指数
2
解决办法
2748
查看次数

@ManyToMany上的selectManyCheckbox中的LazyInitializationException(fetch = LAZY)

当你需要填写JPA M:N关系时,处理多个chackbox的最佳方法是什么...例如我有一个JPA实体硬件和实体连接.

硬件有一组连接:

private Set<Connectivity> connectivities = new HashSet<Connectivity>(0);
Run Code Online (Sandbox Code Playgroud)

并有一个像这样的setter和getter:

@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;
    }
Run Code Online (Sandbox Code Playgroud)

我在gui中使用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>
Run Code Online (Sandbox Code Playgroud)

我有延迟异常的问题,即使我在渲染视图之前调用强制加载该集合:

hardware.getConnectivities().size();
Run Code Online (Sandbox Code Playgroud)

关于如何处理这种情况的任何建议?

我正在使用omnifaces进行实体转换.

Tnx到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 …
Run Code Online (Sandbox Code Playgroud)

jsf jpa primefaces lazy-initialization selectmanycheckbox

9
推荐指数
1
解决办法
2381
查看次数

如何在JSF + Spring + Hibernate中使用DTO

假设我是关于主题DTO的新手.我无法理解将DTO与JSF,Spring和Hibernate结合使用是否正确.
让我解释一下,到目前为止,我已经使用了直接从数据库创建的实体bean,无论是在业务层还是在表示层中.现在我决定尝试使用DTO方法,但我无法理解他们如何提供帮助.
例如,如果我有两个类User和Message,并且用户有更多的消息关联; 如何从数据库中填充DTO?或者我是否在业务层手动填充DTO?谁能发布一个关于如何使用DTO的例子?

先感谢您.此致,罗伯托

java jsf spring hibernate dto

5
推荐指数
2
解决办法
1万
查看次数