首页 > 解决方案 > 在springboot上实现模型继承有奇怪的数据存储库行为

问题描述

我将创建一个实现继承概念的模型。我在想可以通过创建两个(或更多)表(一个用于父类,另一个用于子类),然后基于该表创建两个(或更多)模型。

我目前创建了一个充当父类的模型,并将其抽象化

@NoArgsConstructor // lombok
@AllArgsConstructor // lombok
@Data // lombok
@Entity(name="Account")
@Inheritance
public abstract class AccountModel {
    @Id
    @Column(name="username")
    private String username;
    // Some other fields and getters and setters here
}

然后创建了在类之上扩展的子类

@NoArgsConstructor // lombok
@Data // lombok
@EqualsAndHashCode(callSuper=true) // lombok
@Entity(name="Administrator")
public class AdministratorModel extends AccountModel {
    @Id
    @Column(name="username")
    private String username;
    // some other fields and getters and setters here
}

(目前使用用户名作为join)

我为这两个模型创建了两个存储库

@Repository
public interface AccountRepository extends JpaRepository<AccountModel, String>{};

@Repository
public interface AdministratorRepository extends JpaRepository<AdministratorModel, String>{};

然后,我通过尝试使用方法将新AdministratorModel对象保存到其中来测试它。AdministratorRepositoryJpaRepository.save()

我期望此设置会将对象中的数据填充到数据库上的两个表中,并自动将所有属性映射到每个表。但是,数据只保存在父表上的一条记录,并添加新列(一列是可能引用子表的东西,另一列是子表的属性,不添加连接列'username') ,同时将子表留空。

我认为我做错了。
那么,如何让它按预期工作呢?
我应该不使用继承并使用两个(或更多)存储库手动保存模型,还是应该只使用自定义查询创建一个存储库,还是有其他方法?

标签: javaspringrestspring-bootjpa

解决方案


这种继承应该为@Inheritance注解添加非默认策略。

更改@Inheritance@Inheritance(strategy=InheritanceType.JOINED)解决问题。

正如文档所说,这个策略是:

一种策略,其中特定于子类的字段映射到单独的表,而不是父类的公共字段,并执行连接以实例化子类。


推荐阅读