假设我像这样指定一个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以这种方式行事?
感谢您的输入!
什么是Java中的延迟加载?我不明白这个过程.任何人都可以帮我理解延迟加载的过程吗?
您使用什么样的替代策略来避免LazyLoadExceptions?
我确实理解在视图中打开会话有以下问题:
但是,如果您知道您的应用程序在单个虚拟机上运行,为什么不通过在视图策略中使用开放会话来减轻您的痛苦?
我正在为一个想要使用延迟初始化的客户开发一个项目.当使用默认延迟加载模式映射类时,它们总是会出现"延迟初始化异常".
@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类的标准模式来避免此错误?
欢迎使用片段,非常感谢您的时间.
混淆使用JSF2 + Spring + EJB3或它们的任意组合让我感到有些困惑.我知道Spring的一个主要特性是依赖注入,但是我可以使用JSF托管bean @ManagedBean和@ManagedPropertyanotations,并获得依赖注入功能.使用EJB3,我更加困惑何时将其与JSF一起使用,或者甚至有理由使用它.
那么,在什么样的情况下使用Spring + JSF2或EJB3 + JSF2是个好主意?
到目前为止,我只使用JSF2创建了一些小型Web应用程序,从不需要使用Spring或EJB3.但是,我在许多地方看到人们正在将所有这些东西放在一起.
这里有无数的问题,如何解决"无法初始化代理"问题,通过急切提取,保持交易开放,打开另一个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.clear和session.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哪些无效.
尽管FetchType.EAGER和JOIN 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) 当你需要填写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) 假设我是关于主题DTO的新手.我无法理解将DTO与JSF,Spring和Hibernate结合使用是否正确.
让我解释一下,到目前为止,我已经使用了直接从数据库创建的实体bean,无论是在业务层还是在表示层中.现在我决定尝试使用DTO方法,但我无法理解他们如何提供帮助.
例如,如果我有两个类User和Message,并且用户有更多的消息关联; 如何从数据库中填充DTO?或者我是否在业务层手动填充DTO?谁能发布一个关于如何使用DTO的例子?
先感谢您.此致,罗伯托
hibernate ×5
java ×5
jpa ×5
jsf ×5
lazy-loading ×3
orm ×3
spring ×2
dto ×1
ejb ×1
el ×1
getter ×1
java-ee ×1
performance ×1
primefaces ×1