Spring Boot JPA中抽象类的一对多关联实例化问题求助
解决方案:Spring Boot JPA抽象类关联获取子类实例问题
添加鉴别列与子类鉴别值
JPA的InheritanceType.JOINED策略需要明确的鉴别列来区分不同子类,否则ORM框架无法判断要实例化哪个子类,进而尝试实例化抽象类导致错误。修改抽象类Collectable,添加@DiscriminatorColumn,同时给每个子类添加@DiscriminatorValue:修改后的
Collectable类:@Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name = "collectable_type", discriminatorType = DiscriminatorType.STRING) public abstract class Collectable { @ManyToOne @JoinColumn(name = "collection_id") @JsonBackReference private Collection collection; // 其他字段、getter/setter方法 }修改
Cd子类:@Entity @DiscriminatorValue("CD") public class Cd extends Collectable { // 子类专属字段、getter/setter方法 }修改
Dvd子类:@Entity @Table(name = "dvd") @DiscriminatorValue("DVD") public class Dvd extends Collectable { // 子类专属字段、getter/setter方法 }配套数据库操作:在
collectable表新增collectable_type字符串类型字段,对应cd关联数据行填入"CD",dvd关联数据行填入"DVD"。确保事务内获取关联数据
由于使用FetchType.LAZY,若在事务外访问collectableList会触发懒加载异常,也可能导致ORM无法正确初始化子类实例。需在Service层的事务方法中完成数据查询与关联数据加载:@Service @Transactional public class CollectionService { @Autowired private CollectionRepository collectionRepository; public Collection getCollectionWithCollectables(Long id) { Collection collection = collectionRepository.findById(id).orElseThrow(); // 触发懒加载,确保事务内完成子类实例初始化 collection.getCollectableList().size(); return collection; } }移除不必要的@Component注解
Cd和Dvd作为JPA实体,无需添加@Component注解,该注解会导致Spring错误地将其作为Bean管理,可能引发冲突,直接移除即可。
内容的提问来源于stack exchange,提问作者Yanergy
相关产品推荐
相关产品推荐

