我将创建一个实现继承概念的模型。我当时想通过创建两个(或多个)表(一个用于父类,另一个用于子类),然后基于该表创建两个(或多个)模型,是可能的。
我目前创建了一个充当父类的模型,并将其抽象化
@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()
进行测试。
我期望此设置会将对象中的数据填充到数据库中的两个表,并自动将所有属性映射到每个表。但是,数据仅保存为父表上的一条记录,并添加了新列(其中一列是可能引用子表的内容,另一列是子表的属性,而未添加联接列“用户名”) ,而将子表留空。
我认为我做错了。
然后,如何使其按预期工作?
我应该不使用继承并使用两个(或多个)存储库手动保存模型,还是应该仅使用自定义查询创建一个存储库,还是有其他方法?
答案 0 :(得分:0)
这种继承应将非默认策略添加到@Inheritance
批注中。
将@Inheritance
更改为@Inheritance(strategy=InheritanceType.JOINED)
可以解决此问题。
正如文档所述,此策略是:
一种策略,其中特定于 子类映射到与字段相比单独的表 父类共有的连接 执行以实例化子类。