【问题标题】:Implementing model inheritance on springboot have strange data repository behavior在 Spring Boot 中实现模型继承有奇怪的数据存储库行为
【发布时间】:2019-08-12 03:39:50
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java spring rest spring-boot jpa


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 回答我自己的问题
    猜你喜欢
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2012-11-08
    相关资源
    最近更新 更多