我有一个固定深度为 4 的分层数据结构。为了更好地理解,让我们假设以下(只是一个例子):
因此,级别之间始终存在 1-N 关系。
一个非常重要的用例 (给定一个国家的 id)是一次加载一个国家的全部“内容”,同时对数据库性能的影响最小。
在第一个幼稚的方法中,我在 Java 中创建了 4 个实体类,其中实体“Country”包含一个“State”类型的列表,实体“State”包含一个“County”类型的列表等等......
但是JPA之后创建的当然不是4个表,而是7个(4个用于实体+ 3个用于1-N级之间的连接)。我不知道这是否是一个好的解决方案,因为在幕后有很多加入。
我还尝试将子类型映射到它们的父类型(一个城市属于一个县,一个县属于一个州,一个州属于一个国家)。这会产生 4 个表,但从应用程序的角度来看,一次检索所有数据变得更加困难。如果我没有错,我需要 4 个不同的请求而不是一个。
我怎么能解决这个问题?有没有办法将简单的表格布局(有四个表格,而不是七个表格)与易于使用的实体类(父类型应该知道其子类型)相结合?
如果没有,你怎么会意识到这一点?
我在 Hibernate 和 PostgreSQL 中使用 JPA。
最佳答案
您可以通过使用 @JoinColumn
注释而不是我怀疑您正在使用的 @JoinTable
注释来避免 3 个额外的映射表。
因此,例如:
国家
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="country")
private List<State> stateList;
状态 @ManyToOne
@JoinColumn(name="country_id")
private Country country
数据库表如下:国家
country_id => primary key
状态 state_id => primary key
country_id => foreign key
这样可以避免所有 4 个实体之间的映射表。