Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问jpa实体的关系时出现NullPointerException_Java_Jpa_Java Ee 6 - Fatal编程技术网

Java 访问jpa实体的关系时出现NullPointerException

Java 访问jpa实体的关系时出现NullPointerException,java,jpa,java-ee-6,Java,Jpa,Java Ee 6,当我尝试调用关系的getter时,我得到一个空指针异常。据我所知,在实体仍处于管理状态时,容器将使用适当的列表对象填充此字段 架构是预先存在的,因此这是一个自底向上的映射 这是我的“一方”关系实体: @Entity @Table(name=CollectorHeader.TABLE_NAME) public class CollectorHeader implements Serializable { ... @Id @Column(name = "COLLECTORHE

当我尝试调用关系的getter时,我得到一个空指针异常。据我所知,在实体仍处于管理状态时,容器将使用适当的列表对象填充此字段

架构是预先存在的,因此这是一个自底向上的映射

这是我的“一方”关系实体:

@Entity
@Table(name=CollectorHeader.TABLE_NAME)
public class CollectorHeader implements Serializable {
    ...
    @Id
    @Column(name = "COLLECTORHEADERID")
    private long id;

    @OneToMany(mappedBy="collectorHeader", fetch=FetchType.LAZY)
    private List<CollectorDetail> collectorDetails;
    ...
}
public CollectorDetail createCollectorDetail(long collectorHeaderId, long     provenanceLinkPk, @NotNull String provenanceLinkClass) throws SystemException {
    CollectorHeader collectorHeader = em.find(CollectorHeader.class, collectorHeaderId);
    if(collectorHeader == null) {
        String error = "There is no Collector Header with the id: '" + collectorHeaderId + "'";
        log.error(error);
        throw new SystemException(error);
    }
    CollectorDetail collectorDetail =
        new CollectorDetail(NextNumberFactory.getInstance().getNextNumberLong("cocollectordetail")
                , collectorHeader
                , provenanceLinkPk
                , provenanceLinkClass);
    collectorHeader.getCollectorDetails().add(collectorDetail); //NULLPOINTEREXCEPTION
    em.merge(collectorDetail);
    em.merge(collectorHeader);
    return collectorDetail;
}
这就是我所谓的关系:

@Entity
@Table(name=CollectorHeader.TABLE_NAME)
public class CollectorHeader implements Serializable {
    ...
    @Id
    @Column(name = "COLLECTORHEADERID")
    private long id;

    @OneToMany(mappedBy="collectorHeader", fetch=FetchType.LAZY)
    private List<CollectorDetail> collectorDetails;
    ...
}
public CollectorDetail createCollectorDetail(long collectorHeaderId, long     provenanceLinkPk, @NotNull String provenanceLinkClass) throws SystemException {
    CollectorHeader collectorHeader = em.find(CollectorHeader.class, collectorHeaderId);
    if(collectorHeader == null) {
        String error = "There is no Collector Header with the id: '" + collectorHeaderId + "'";
        log.error(error);
        throw new SystemException(error);
    }
    CollectorDetail collectorDetail =
        new CollectorDetail(NextNumberFactory.getInstance().getNextNumberLong("cocollectordetail")
                , collectorHeader
                , provenanceLinkPk
                , provenanceLinkClass);
    collectorHeader.getCollectorDetails().add(collectorDetail); //NULLPOINTEREXCEPTION
    em.merge(collectorDetail);
    em.merge(collectorHeader);
    return collectorDetail;
}
Sql架构:

CREATE TABLE COCOLLECTORHEADER (
    COLLECTORHEADERID   DECIMAL(20,0) NOT NULL PRIMARY KEY,
    COLLECTEDTIMESTAMP TIMESTAMP, -- the date when the information was collected
    PROCESSEDTIMESTAMP TIMESTAMP, -- the date when the information was processed
    FILEFORMAT VARCHAR(16) NOT NULL,
    SEQUENCENUMBER INTEGER
);

CREATE TABLE COCOLLECTORDETAIL (
    COLLECTORDETAILID   DECIMAL(20,0) NOT NULL PRIMARY KEY,
    COLLECTORHEADERID   DECIMAL(20,0) NOT NULL
        REFERENCES COCOLLECTORHEADER(COLLECTORHEADERID),
    PROVENANCELINKPK        DECIMAL(20,0) NOT NULL,
    PROVENANCELINKCLASS VARCHAR(128) NOT NULL
);

如有任何帮助,将不胜感激。

使用有效的收集对象初始化
collectorDetails
,如下所示:

private List<CollectorDetail> collectorDetails = new ArrayList<CollectorDetail>();
private List collectorDetails=new ArrayList();

同时检查

我们还需要查看获取NPE和stacktrace的代码。直觉提示您无法持久化链接实体,我看不到任何级联设置。谢谢,这似乎解决了问题:)。注意:我还必须将持久性bean代码更改为:
em.persist(collectorDetail);em.merge(collectorHeader)因为字段的级联属性未设置为“持久”或“全部”。(当它尝试刷新时,我遇到了一个异常)。因此,从后一个技巧中,我假设我应该只初始化构造函数或字段声明中的字段,以避免容器认为对象是“脏”的,而不是“脏”的。