java - 在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
对象保存到其中来测试它。AdministratorRepository
JpaRepository.save()
我期望此设置会将对象中的数据填充到数据库上的两个表中,并自动将所有属性映射到每个表。但是,数据只保存在父表上的一条记录,并添加新列(一列是可能引用子表的东西,另一列是子表的属性,不添加连接列'username') ,同时将子表留空。
我认为我做错了。
那么,如何让它按预期工作呢?
我应该不使用继承并使用两个(或更多)存储库手动保存模型,还是应该只使用自定义查询创建一个存储库,还是有其他方法?
解决方案
这种继承应该为@Inheritance
注解添加非默认策略。
更改@Inheritance
以@Inheritance(strategy=InheritanceType.JOINED)
解决问题。
正如文档所说,这个策略是:
一种策略,其中特定于子类的字段映射到单独的表,而不是父类的公共字段,并执行连接以实例化子类。
推荐阅读
- javascript - 我返回了两个值,但控制台只显示一个值。我的代码有什么问题?
- python - Django表单测试非字段错误
- java - 即使在堆栈溢出错误中也显示整个堆栈跟踪
- python-3.x - 熊猫的最大值和最小值
- android - 为什么我的布局没有显示在滚动视图中?
- php - 无法将 SQL 查询转换为 laravel eloquent
- javascript - 在 react native 中使用 reanimated 重新加载的问题
- c# - 为什么 ASP.NET Core 在中间件管道结束时返回 404?
- mongodb - 使用 mongodb 中的聚合获取包含多个字段的最大值的对象
- .net - 在.Net中以编程方式比较两个文件之间的git更改