使用JPA实现分层数据结构(固定深度)

ala*_*eno 6 java postgresql orm hibernate jpa

我有一个固定深度为4的分层数据结构.为了更好地理解,我们假设以下(只是一个例子):

  • "根"级别称为国家/地区
  • 每个国家/地区都包含任意数量的
  • 每个州都有一个任意数量的
  • 每个县都包含任意数量的城市

因此,级别之间始终存在1-N关系.

一个非常重要的用例(给定一个国家的id)是一次加载一个国家的整个"内容",对数据库的性能影响最小.

在第一个天真的方法中,我在Java中创建了4个授权类,其中实体"Country"包含"State"类型的列表,实体"State"包含"County"类型的列表,依此类推......但是之后JPA创建的当然不是4个表,而是7个(4个实体+ 3个用于1-N之间的连接).我不知道这是否是一个很好的解决方案,因为引擎盖下有很多加入.

我还试图将子类型映射到它们的父类型(一个城市属于一个县,一个县属于一个州,一个州属于一个国家).这导致4个表,但是从应用程序的角度来看,一次检索所有数据变得更加困难.如果我没错,我需要4个不同的请求而不是一个.

我怎么能解决这个问题?有没有办法将简单的表格布局(有四个表,而不是七个)与易于使用的实体类(父类型应该知道它的子节点)相结合?如果没有,你怎么会意识到这一点?

我正在使用JPA与Hibernate和PostgreSQL.

Roh*_*hit 5

@JoinColumn您可以通过使用注释而不是@JoinTable我怀疑您正在使用的注释来避免 3 个额外的映射表。

例如:

国家

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="country")
private List<State> stateList;
Run Code Online (Sandbox Code Playgroud)

状态

@ManyToOne
@JoinColumn(name="country_id")
private Country country
Run Code Online (Sandbox Code Playgroud)

数据库表如下:

国家

country_id => primary key
Run Code Online (Sandbox Code Playgroud)

状态

state_id => primary key
country_id => foreign key
Run Code Online (Sandbox Code Playgroud)

这样就可以避免所有 4 个实体之间的映射表。