Spring Data JDBC:在非拥有的关系上连接



我的数据库中有两个聚合根实体,首先是Organization,VolunteerModerators

表:

create table organizations
(
id   uuid primary key default uuid_generate_v4(),
name varchar(255) not null,
slug varchar(64)  not null unique
);
create table organization_moderators
(
id              uuid primary key default uuid_generate_v4(),
user_id         uuid not null,
organization_id uuid not null,
is_owner        boolean          default false,
unique (user_id, organization_id),
foreign key (user_id) references users (id) on delete cascade,
foreign key (organization_id) references organizations (id) on delete cascade
);
create table organization_volunteers
(
id              uuid primary key default uuid_generate_v4(),
user_id         uuid not null,
organization_id uuid not null,
unique (user_id, organization_id),
foreign key (user_id) references users (id) on delete cascade,
foreign key (organization_id) references organizations (id) on delete cascade
);

实体:

@Value
@Table("organizations")
public class Organization {
@Id
@JsonIgnore
UUID id;
@Column("name")
String name;
@Column("slug")
String slug;
@MappedCollection(idColumn = "organization_id")
Set<Moderator> moderators;
@MappedCollection(idColumn = "organization_id")
Set<Volunteer> volunteers;
}
@Value
@Table("organization_moderators")
public class Moderator {
@Id
@JsonIgnore
UUID id;
@Column("user_id")
UUID userId;
@Column("is_owner")
boolean isOwner;
}
@Value
@Table("organization_volunteers")
public class Volunteer {
@Id
@JsonIgnore
UUID id;
@JsonIgnore
@Column("user_id")
UUID userId;
}

第二,用户聚合根。

表:

create table users
(
id            uuid primary key default uuid_generate_v4(),
username      varchar(32)  not null unique,
email_address varchar(255) not null unique,
password      varchar(128) not null
);

实体:

@Value
@Table("users")
public class User {
@Id
UUID id;
@Column("username")
String username;
@Column("email_address")
String emailAddress;
@Column("password")
String password;
}

对于我想要做的查询,我想要抓取一个组织及其志愿者,并且我想要包含来自用户表的用户名。如何使用Spring Data JDBC实现这一点呢?我理解User不能成为Organization的聚合根的一部分,但这仍然是我想一次性查询的数据。

我的第一个问题是:你为什么要这样做?这并不是说这个请求完全不合理,但是通过向用户存储库添加一些缓存可能会更好地解决这个问题。

但是让我们假设我们同意你所要求的方法是可行的。

我看到两种替代方法:

  1. 创建一个替代的组织聚合,它包含直接引用User类的Volunteer类的修改变体。重要的是永远不要试图保存这种Organization。因此,我建议不要从CrudRepository继承存储库,而只从Repository继承存储库,并且只包含您实际需要的读取方法,而不包含写入方法。

  2. 你总是可以写一个自定义的QueryResultSetExtractor来加载你想要的数据。

请记住,Spring Data JDBC试图使一些事情变得简单,同时仍然允许您使用JDBC做任何您想做的事情。

相关内容

  • 没有找到相关文章

最新更新