Java 访问jpa实体的关系时出现NullPointerException
当我尝试调用关系的getter时,我得到一个空指针异常。据我所知,在实体仍处于管理状态时,容器将使用适当的列表对象填充此字段 架构是预先存在的,因此这是一个自底向上的映射 这是我的“一方”关系实体: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
@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)代码>因为字段的级联属性未设置为“持久”或“全部”。(当它尝试刷新时,我遇到了一个异常)。因此,从后一个技巧中,我假设我应该只初始化构造函数或字段声明中的字段,以避免容器认为对象是“脏”的,而不是“脏”的。