gpt4 book ai didi

java - 使用 SpringBoot 进行 Hibernate 继承映射 - 转换类异常

转载 作者:行者123 更新时间:2023-12-04 11:34:47 25 4
gpt4 key购买 nike

我有这个对象:

@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结果相同

最佳答案

findOne方法由 JpaSpecificationExecutor 提供契约(Contract)和下面的实现(`SimpleJpaRepository)在不同的 spring-data-jpa 项目版本中看到了一些变化。
虽然鉴于报告的错误这一点尚不清楚,但运行时可能会动态生成与您的多态结构不匹配的新查询(您可以激活 hibernate SQL 日志记录来检查这些)。
话虽如此,您最好使用 findByIdgetById准备好的替代方案,而不是创建自己的基于查询的方法。您应该删除您的自定义 findOne方法出你的JpaRepository宣言:

@Repository
public interface EnfantRepository extends PersonneBaseRepository<Enfant>, JpaSpecificationExecutor<Enfant> {

// ...
}
然后您就可以查询 Enfant基于其标识符的实体:
Enfant enfant = enfantRepo.findById(7L).orElseThrow(() -> new EntityNotFoundException(id));
或者干脆绕过 Optional使用 getById 返回值选择:
Enfant enfant = enfantRepo.getById(7L);

关于java - 使用 SpringBoot 进行 Hibernate 继承映射 - 转换类异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68906909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com