Java 继承类上的JPA/Hibernate关系返回null

Java 继承类上的JPA/Hibernate关系返回null,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个用于实体的分层类系统,在引入关系之前,它们都很好。以下是一些示例代码: 基类: @MappedSuperclass 公共类基类 { //一些领域 //ID是MySQL自动递增的无符号BIGINT 保护长id; //……其他领域 @JsonCreator 公共基类( //…田地 ) { //分配字段 } 公共基类(){/**默认复制构造函数*/} 公共基类更新(基类值) { //对所有字段重复下面的行 this.field1=(value.field1!=null)?value.field

我有一个用于实体的分层类系统,在引入关系之前,它们都很好。以下是一些示例代码:

基类

@MappedSuperclass
公共类基类
{
//一些领域
//ID是MySQL自动递增的无符号BIGINT
保护长id;
//……其他领域
@JsonCreator
公共基类(
//…田地
)
{
//分配字段
}
公共基类(){/**默认复制构造函数*/}
公共基类更新(基类值)
{
//对所有字段重复下面的行
this.field1=(value.field1!=null)?value.field1:this.field1;
//最后,为了链接
归还这个;
}
//所有字段的getter和setter
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”,updateable=false)
@JsonProperty(“id”)
公共长getId()
{
返回此.id;
}
公共基类setId(长值)
{
this.id=value!=null?值:this.id;
归还这个;
}
@列(name=“field1”)
@JsonProperty(“字段1”)
公共字符串getField1()
{
返回此字段。字段1;
}
公共基类setField1(Field1Type值)
{
this.field1=值;
归还这个;
}
}
继承类

@实体
@表(name=“`Table_name`”)
@动态服务器
@动态铜日期
公共类InheritedClass扩展基类实现可序列化
{
/**
*该值仅用于演示,它是根据可序列化实体随机生成的
*/
私有静态最终长serialVersionUID=1L;
私有列表相关字段;
私有关联Class2关联Class2字段;
公共继承类(){/**默认复制构造函数*/}
公共继承类(基类值)
{
super.update(值);
}
//inheritedClassField是RelatedClass1中关系的多对一端中的字段
@Transient//javax.persistence,而不是bean
@JsonProperty(“相关的1类字段”)
@独身癖(
targetEntity=RelatedClass1.class
,fetch=FetchType.EAGER
,cascade={CascadeType.ALL}
,mappedBy=“inheritedClassField”
)
公共列表GetRelatedClassField()
{
返回此.relatedClass1字段;
}
公共继承类SetRelatedClassField(列表值)
{
this.relatedClassField=值;
归还这个;
}
//inheritedClassField是RelatedClass1中关系的多对一端中的字段
@Transient//javax.persistence,而不是bean
@JsonProperty(“相关的2类字段”)
@许多酮(
targetEntity=RelatedClass2.class
,fetch=FetchType.EAGER
,cascade={CascadeType.ALL}
)
@连接柱(
name=“相关\u id”
,referencedColumnName=“id”
)
public RelatedClass2 GetRelatedClass2字段()
{
返回此.relatedClass2字段;
}
公共继承类SetRelatedClass2字段(RelatedClass2值)
{
this.relatedClass2字段=值;
归还这个;
}
}
当我尝试访问
InheritedClass
的实例时,
relatedclassField
relatedClass2Field
null
,但它们是在数据库中填充的

但是 如果我通过字段访问策略定义关系,它们将返回正确的值:

@Access(AccessType.FIELD)
@独身癖(
targetEntity=RelatedClass1.class
,fetch=FetchType.EAGER
,cascade={CascadeType.ALL}
,mappedBy=“inheritedClassField”
)
私有列表相关字段;
@许多酮(
targetEntity=RelatedClass2.class
,fetch=FetchType.EAGER
,cascade={CascadeType.ALL}
)
@连接柱(
name=“相关\u id”
,referencedColumnName=“id”
)
私有关联Class2关联Class2字段;
@JsonProperty(“相关的1类字段”)
公共列表GetRelatedClassField()
{
返回此.relatedClass1字段;
}
公共继承类SetRelatedClassField(列表值)
{
this.relatedClassField=值;
归还这个;
}
@JsonProperty(“相关的2类字段”)
public RelatedClass2 GetRelatedClass2字段()
{
返回此.relatedClass2字段;
}
公共继承类SetRelatedClass2字段(RelatedClass2值)
{
this.relatedClass2字段=值;
归还这个;
}

您不应在这些方法上使用
@Transient
注释:

@Transient
@独身癖(
targetEntity=RelatedClass1.class
,fetch=FetchType.EAGER
,cascade={CascadeType.ALL}
,mappedBy=“inheritedClassField”
)
公共列表GetRelatedClassField()
// ...
@短暂的
@许多酮(
targetEntity=RelatedClass2.class
,fetch=FetchType.EAGER
,cascade={CascadeType.ALL}
)
@连接柱(
name=“相关\u id”
,referencedColumnName=“id”
)
public RelatedClass2 GetRelatedClass2字段()
// ...
根据
@Transient
注释指定属性或字段不是持久的

还有一个简单的例子。假设您拥有以下实体:

@实体
@表(name=“TST_患者”)
公共阶层人士{
私人长id;
// ...
私人出生日期;
@身份证
@列(name=“P_ID”)
公共长getId(){
返回id;
}
@列(name=“P_DOB”)
公共日期getDateOfBirth(){
出生返回日期;
}
@短暂的
公共长假{
返回它。年之间(
LocalDateTime.ofInstant(Instant.ofEpochMilli(dateOfBirth.getTime()),ZoneOffset.UTC),
LocalDateTime.now()
);
}
//为简洁起见省略了setters
}
这里我们使用的是
@Transient