JPA AccessType.Property 未能从嵌套 类 中检索值
JPA AccessType.Property failing to retrieve value from nested classes
我正在尝试将 JSON 解析为 @Entity,以便将数据保存在 table 中。我确认解析有效,但在尝试保留数据时我遇到了 运行 问题。为了在嵌套的 classes(两个深度)中检索所需的值,我在 "helper" 方法上使用 @Access(AccessType.PROPERTY) 注释。
我最好的猜测是实体对象是在从嵌套的 class 中检索值之前创建的,当它试图检索 "nested" 值时,那些 class 实例是无效的。因此它无法将值映射到持久性字段。
以下是我确定是异常的重要部分:
Exception Description: The method [getNestedHref] on the object [com.something.dotcom.bleep.parsers.HierarchyV2] triggered an exception.
Internal Exception: java.lang.reflect.InvocationTargetException
Target Invocation Exception: java.lang.NullPointerException
Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping[nestedHref-->schema.tbl_Hierarchy.HREF]
Descriptor: RelationalDescriptor(com.something.dotcom.bleep.parsers.HierarchyV2 --> [DatabaseTable(schema.tbl_Hierarchy)])
下面是我正在解析的JSON:
{
"links": {
"self": {
"href": "http:\/\/data.something.com\/v2\/hierarchy\/blah\/id\/blahblah"
}
},
"name": "nameValue",
"id": "idValue",
"hierarchyId": "hierarchyValue",
"narrowerTerm": [
{
"href": "http:\/\/data.something.com\/v2\/hierarchy\/blah\/id\/somethingElse1",
"sequence": 0
},
{
"href": "http:\/\/data.something.com\/v2\/hierarchy\/blah\/id\/somethingElse2",
"sequence": 1
},
{
"href": "http:\/\/data.something.com\/v2\/hierarchy\/blah\/id\/somethingElse3",
"sequence": 2
}
]
}
我在保留 NAME、ID、HIERARCHY_ID、UPD 和 CRT 日期方面没有问题。我还可以使用 toString() 方法记录 href。但是,我似乎无法保留此值(请参阅链接中的 href-->self-->href)。
@JsonIgnoreProperties({"href","parentId","recordCreateDate","recordUpdateDate"})
@Entity
//@Cache(isolation = CacheIsolationType.ISOLATED)
@Table(name = "HIERARCHY_V2", schema = "SCHEMA")
@Access(AccessType.FIELD)
public class HierarchyV2{
@Id
private String id;
private String name;
@Column(name = "HIERARCHY_ID")
private String hierarchyId;
@Column(name = "PARENT_ID")
private String parentId;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "REC_CRT_DT")
private Date recordCreateDate;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "REC_UPD_DT")
private Date recordUpdateDate;
@Transient
private HierarchyLinks links;
@Transient
private List<HierarchyTerm> broaderTerm;
@Transient
private List<HierarchyTerm> narrowerTerm;
//Typical getters, setters, overridden methods....
@Access(AccessType.PROPERTY)
@Column(name = "HREF")
protected String getNestedHref(){
return this.links.getSelf().getHref();
}
protected void setNestedHref(String href){
HierarchyLinks links = new HierarchyLinks();
this.links = links;
HierarchyV2Self hvs = new HierarchyV2Self();
this.links.setSelf(hvs);
hvs.setHref(href);
}
@Override
public String toString(){
return this.name + "\t" + this.id + "\t" + this.hierarchyId + "\t" + this.getNestedHref() + "\t" + this.parentId;
}
以下是 "nested" class。我很快就用 @Embeddable 和 @Embedded 注释搞混了,试图让这项工作正常进行——我没有多想它,因为我的大脑现在已经糊涂了。我最初将这些 classes 作为静态内部 classes,然后将它们从实体 class 中移出。
我花了大约四个小时来写作和重写,现在我要放下我的骄傲了。感谢任何帮助。
public class HierarchyLinks {
private HierarchyV2Self self;
public HierarchyV2Self getSelf() {
return self;
}
public void setSelf(HierarchyV2Self self) {
this.self = self;
}
}
public class HierarchyV2Self {
private String href;
public String getHref() {
return href;
}
public void setHref(String href) {
this.href = href;
}
}
您的@Transient 注释可能会导致此处出现问题。
@Transient
private String href;
@Transient 用于指示不应在底层持久性系统(即数据库)中持久化特定字段。
你也可以关注 this link
我正在尝试将 JSON 解析为 @Entity,以便将数据保存在 table 中。我确认解析有效,但在尝试保留数据时我遇到了 运行 问题。为了在嵌套的 classes(两个深度)中检索所需的值,我在 "helper" 方法上使用 @Access(AccessType.PROPERTY) 注释。
我最好的猜测是实体对象是在从嵌套的 class 中检索值之前创建的,当它试图检索 "nested" 值时,那些 class 实例是无效的。因此它无法将值映射到持久性字段。
以下是我确定是异常的重要部分:
Exception Description: The method [getNestedHref] on the object [com.something.dotcom.bleep.parsers.HierarchyV2] triggered an exception.
Internal Exception: java.lang.reflect.InvocationTargetException
Target Invocation Exception: java.lang.NullPointerException
Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping[nestedHref-->schema.tbl_Hierarchy.HREF]
Descriptor: RelationalDescriptor(com.something.dotcom.bleep.parsers.HierarchyV2 --> [DatabaseTable(schema.tbl_Hierarchy)])
下面是我正在解析的JSON:
{
"links": {
"self": {
"href": "http:\/\/data.something.com\/v2\/hierarchy\/blah\/id\/blahblah"
}
},
"name": "nameValue",
"id": "idValue",
"hierarchyId": "hierarchyValue",
"narrowerTerm": [
{
"href": "http:\/\/data.something.com\/v2\/hierarchy\/blah\/id\/somethingElse1",
"sequence": 0
},
{
"href": "http:\/\/data.something.com\/v2\/hierarchy\/blah\/id\/somethingElse2",
"sequence": 1
},
{
"href": "http:\/\/data.something.com\/v2\/hierarchy\/blah\/id\/somethingElse3",
"sequence": 2
}
]
}
我在保留 NAME、ID、HIERARCHY_ID、UPD 和 CRT 日期方面没有问题。我还可以使用 toString() 方法记录 href。但是,我似乎无法保留此值(请参阅链接中的 href-->self-->href)。
@JsonIgnoreProperties({"href","parentId","recordCreateDate","recordUpdateDate"})
@Entity
//@Cache(isolation = CacheIsolationType.ISOLATED)
@Table(name = "HIERARCHY_V2", schema = "SCHEMA")
@Access(AccessType.FIELD)
public class HierarchyV2{
@Id
private String id;
private String name;
@Column(name = "HIERARCHY_ID")
private String hierarchyId;
@Column(name = "PARENT_ID")
private String parentId;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "REC_CRT_DT")
private Date recordCreateDate;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "REC_UPD_DT")
private Date recordUpdateDate;
@Transient
private HierarchyLinks links;
@Transient
private List<HierarchyTerm> broaderTerm;
@Transient
private List<HierarchyTerm> narrowerTerm;
//Typical getters, setters, overridden methods....
@Access(AccessType.PROPERTY)
@Column(name = "HREF")
protected String getNestedHref(){
return this.links.getSelf().getHref();
}
protected void setNestedHref(String href){
HierarchyLinks links = new HierarchyLinks();
this.links = links;
HierarchyV2Self hvs = new HierarchyV2Self();
this.links.setSelf(hvs);
hvs.setHref(href);
}
@Override
public String toString(){
return this.name + "\t" + this.id + "\t" + this.hierarchyId + "\t" + this.getNestedHref() + "\t" + this.parentId;
}
以下是 "nested" class。我很快就用 @Embeddable 和 @Embedded 注释搞混了,试图让这项工作正常进行——我没有多想它,因为我的大脑现在已经糊涂了。我最初将这些 classes 作为静态内部 classes,然后将它们从实体 class 中移出。
我花了大约四个小时来写作和重写,现在我要放下我的骄傲了。感谢任何帮助。
public class HierarchyLinks {
private HierarchyV2Self self;
public HierarchyV2Self getSelf() {
return self;
}
public void setSelf(HierarchyV2Self self) {
this.self = self;
}
}
public class HierarchyV2Self {
private String href;
public String getHref() {
return href;
}
public void setHref(String href) {
this.href = href;
}
}
您的@Transient 注释可能会导致此处出现问题。
@Transient
private String href;
@Transient 用于指示不应在底层持久性系统(即数据库)中持久化特定字段。
你也可以关注 this link