【发布时间】:2021-10-24 15:34:04
【问题描述】:
我有这个对象:
@Entity
@Table(name = "PERSONNE")
@NamedQuery(name = "Personne.findAll", query = "SELECT p FROM Personne p")
@Inheritance(strategy = InheritanceType.JOINED)
@ClassExtractor(PersonneClassExtractor.class)
@NoArgsConstructor
@AllArgsConstructor
@Data
@SuperBuilder
@ToString(of = { "personneId", "perId" })
@EqualsAndHashCode(of = { "personneId", "perId" })
public class Personne implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@ReturnInsert
@Column(name = "PERSONNE_ID")
protected Long personneId;
..
}
还有这个:
@Entity
@Table(name = "ENFANT")
@NamedQuery(name = "Enfant.findAll", query = "SELECT e FROM Enfant e")
@PrimaryKeyJoinColumn(name = "PERSONNE_ID")
@Inheritance(strategy = InheritanceType.JOINED)
@Data
@SuperBuilder
@NoArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@Audit
public class Enfant extends Personne {
private static final long serialVersionUID = 1L;
..
}
还有这个:
@Repository
public interface EnfantRepository extends PersonneBaseRepository<Enfant>,
JpaSpecificationExecutor<Enfant> {
@Query("SELECT e FROM Enfant e WHERE e.personneId = ?1")
Enfant findOne(Long enfantId);
..
}
和
@NoRepositoryBean
public interface PersonneBaseRepository<T extends Personne>
extends JpaRepository<T, Long> {
}
但是当我这样做时
Enfant enfant = enfantRepo.findOne(7L);
我有这个错误:
class com.mundos.model.persons.Personne cannot be cast to class com.mundos.model.persons.Enfant (com.mundos.model.persons.Personne and com.mundos.model.persons.Enfant are in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @67cae0fe)
我也试过enfantRepo.findById,结果相同
【问题讨论】:
-
你是如何将你的实例持久化到数据库中的?该错误表明数据库中的行是 Personne 实例,而不是 Enfant 子类实例,因此您可能在设置数据的方式上犯了错误,而不是在读取数据的方式上 - 尽管您可能想要检查 PersonneClassExtractor它知道子类并将该行正确解释为 Enfant 的类。
-
你的类路径中有 spring-boot-devtools 吗?
-
您的实体在 src 或依赖 jar 中?(我遇到过)。请参阅 Holger 评论 - stackoverflow.com/questions/54536895/…
标签: java spring-boot hibernate jpa spring-data-jpa