Java JPA存储库在我的实体中保存了错误类型的字段 DB:H2 春天,JPA

Java JPA存储库在我的实体中保存了错误类型的字段 DB:H2 春天,JPA,java,hibernate,jpa,spring-data-jpa,h2,Java,Hibernate,Jpa,Spring Data Jpa,H2,我有一个名为Message的实体,其字段类型基本上只是一个具有id的通用父级: public class Message { @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval = true) @NonNull List<GenericDTO> records; } 现在,当我尝试保存邮件时,记录字段将保存为GenericDTO而不是childto。 这个问题与H

我有一个名为Message的实体,其字段类型基本上只是一个具有id的通用父级:

public class Message {

    @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval = true)
    @NonNull
    List<GenericDTO> records;
}
现在,当我尝试保存邮件时,记录字段将保存为GenericDTO而不是childto。

这个问题与H2有关吗


默认情况下,jpa将层次结构的所有实体保存在一个表中,该表包含实体所有可能字段的列。这就是为什么您的孩子会被保存到GENERICDTO表中。要将层次结构中每个类的实体保存到单独的表中,需要指定继承策略:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

我建议您查看这篇文章,以获得有关该主题的更多信息:

解决方案有点棘手,
GenericDTO
ChildDTO
在不同的项目中,所发生的情况是,childto所在的项目中的包没有被扫描,因此spring不知道。添加包扫描解决了我的问题。

您的列表是
GenericDTO
,而不是
ChildDTO
的列表。因此,对于JPA,它需要存储一个
GenericDTO
@M.Deinum是的,但是JPA应该能够处理这种多态性,不是吗?我还有其他的
子对象
s,这就是
一般对象
的原因。当我保存我的
消息时
我保存的数据是
子数据到
而不是
一般数据到
。集合需要具有适当的类型,因为类型将由该类型决定,在这种情况下,即
一般数据到
。也不应该是
GenericDTO
抽象的
@MappedSuperclass
而不是
@Entity
?@M.Deinum如果我使用
@MappedSuperclass
我不能在
@OneToMany
中使用
GenericDTO
@Data
@Builder(toBuilder = true)
@Entity
@NoArgsConstructor
@AllArgsConstructor
public class ChildDTO extends GenericDTO{
  // some fields
}
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)