在springboot上实现模型继承会产生奇怪的数据存储库行为

时间:2019-08-12 03:39:50

标签: java spring rest spring-boot jpa

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

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

@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
}

(当前,用户名用作联接)

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

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

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

然后,我尝试通过使用AdministratorModel方法将新的AdministratorRepository对象保存到JpaRepository.save()进行测试。

我期望此设置会将对象中的数据填充到数据库中的两个表,并自动将所有属性映射到每个表。但是,数据仅保存为父表上的一条记录,并添加了新列(其中一列是可能引用子表的内容,另一列是子表的属性,而未添加联接列“用户名”) ,而将子表留空。

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

1 个答案:

答案 0 :(得分:0)

这种继承应将非默认策略添加到@Inheritance批注中。

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

正如文档所述,此策略是:

  

一种策略,其中特定于       子类映射到与字段相比单独的表       父类共有的连接       执行以实例化子类。