List <Object>不为null,但不能在没有nullpointer异常的情况下调用.isEmpty

Pat*_*ati 3 java list nullpointerexception httpsession

    Laerer laerer = (Laerer) session.getAttribute("laererInnlogget");
    List<Spoerreskjema> ss = laerer.getSkjemaliste();

    if(ss == null)
        System.out.println("1");
    if(ss != null)
        System.out.println("2");
    if(ss.isEmpty())
        System.out.println("3");
    if(!ss.isEmpty())
        System.out.println("4");
Run Code Online (Sandbox Code Playgroud)

if循环用于显示问题所在.

控制台将显示2,然后在到达ss.isEmpty()时抛出NullPointerException

laerer对象不为null,但包含一个应为null(或至少为空)的List

所有这些都存储在postgresql数据库中或从postgresql数据库中获取.

知道问题可能是什么?

顺便说一句,调用ss.size()也会导致NullPointerException

我本质上希望能够检查列表是否为空.

SEVERE: Servlet.service() for servlet [no.hib.prosjekt01.controllers.laerer.LaererHjemServlet] in context with path [/prosjekt01] threw exception
java.lang.NullPointerException
    at org.apache.openjpa.enhance.no$hib$prosjekt01$models$Laerer$pcsubclass.pcReplaceField(Unknown Source)
    at org.apache.openjpa.kernel.StateManagerImpl.replaceField(StateManagerImpl.java:3254)
    at org.apache.openjpa.kernel.StateManagerImpl.storeObjectField(StateManagerImpl.java:2681)
    at org.apache.openjpa.kernel.StateManagerImpl.storeObject(StateManagerImpl.java:2671)
    at org.apache.openjpa.jdbc.meta.strats.StoreCollectionFieldStrategy.load(StoreCollectionFieldStrategy.java:596)
    at org.apache.openjpa.jdbc.meta.FieldMapping.load(FieldMapping.java:934)
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:681)
    at org.apache.openjpa.kernel.DelegatingStoreManager.load(DelegatingStoreManager.java:117)
    at org.apache.openjpa.kernel.ROPStoreManager.load(ROPStoreManager.java:78)
    at org.apache.openjpa.kernel.StateManagerImpl.loadFields(StateManagerImpl.java:3146)
    at org.apache.openjpa.kernel.StateManagerImpl.loadField(StateManagerImpl.java:3226)
    at org.apache.openjpa.kernel.StateManagerImpl.fetchObjectField(StateManagerImpl.java:2468)
    at org.apache.openjpa.kernel.StateManagerImpl.fetchField(StateManagerImpl.java:890)
    at org.apache.openjpa.kernel.StateManagerImpl.fetch(StateManagerImpl.java:852)
    at org.apache.openjpa.enhance.RedefinitionHelper$1.invoke(RedefinitionHelper.java:230)
    at com.sun.proxy.$Proxy68.isEmpty(Unknown Source)
    at no.hib.prosjekt01.controllers.laerer.LaererHjemServlet.doGet(LaererHjemServlet.java:35)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

EDIT1:

Creating subclass for "[class no.hib.prosjekt01.models.Spoerreskjema, class no.hib.prosjekt01.models.Laerer, class no.hib.prosjekt01.models.Svar, class no.hib.prosjekt01.models.Spoersmaal, class no.hib.prosjekt01.models.Kryptering]". This means that your application will be less efficient and will consume more memory than it would if you ran the OpenJPA enhancer. Additionally, lazy loading will not be available for one-to-one and many-to-one persistent attributes in types using field access; they will be loaded eagerly instead.
Run Code Online (Sandbox Code Playgroud)

EDIT2:

@Entity
@Table(name = "laerer")
public class Laerer implements Serializable {
private static final long serialVersionUID = 1L;

@Id
private String id;
private String fornavn;
private String etternavn;
@Lob
private byte[] passord;

@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "laerer")
private List<Spoerreskjema> skjemaliste;



public Laerer(String epost, String fornavn, String etternavn, byte[] passord) {
    this.id = epost;
    this.fornavn = fornavn;
    this.etternavn = etternavn;
    this.passord = passord;
    this.skjemaliste = new ArrayList<Spoerreskjema>();
}

public Laerer() {
    id = null;
    fornavn = null;
    etternavn = null;
    passord = null;
    skjemaliste = null;
}
Run Code Online (Sandbox Code Playgroud)

Ren*_* M. 5

好的,我现在拥有它.您正在加载Laerer对象,然后将其放入会话中.稍后您会尝试在其上访问延迟加载的集合.但问题是,列表中的代理(应该调用数据库来获取数据)需要与加载Laerer时对数据库的调用处于同一事务中.

有几个解决方案.

  1. 当你知道该列表中没有那么多对象变为"EAGER"并且你很高兴.

  2. 从实体管理器获取Laerer对象后,在DAO中调用列表加载它.与直接加载"EAGER"相同.(JPA定义一个实体只能有一个EAGER加载列表)

  3. 不要直接加载列表.而是在加载Laerer Object时加载ID列表.然后,当您通过会话访问ID列表时,可以再次调用数据库以按ID加载所需的对象.例如,您可以将ID列表作为逗号分隔的字符串放在实体的瞬态变量中.此字符串可以直接在SELECT a FROM a.class WHERE a.id IN(:IDS)Query中使用.