【问题标题】:Spring boot webflux how to save update and delete multiple Monos at the same timespring boot webflux如何同时保存更新和删除多个Monos
【发布时间】:2020-03-18 15:08:35
【问题描述】:

我已经搜索过,但没有得到任何具体答案。我使用 Cassandra 作为我的数据库,并且我有三个具有相同属性的表。如何同时保存、更新和删除这三个表中的相同数据。

用户表

Create Table user (
  userid bigint,
  username text,
  password text,
  name text,
  email text,
  phone text,
  birthday text,
  biography text,
  PRIMARY KEY (userid)
)

user_username 表

Create Table user (
  username text,
  userid bigint,
  password text,
  name text,
  email text,
  phone text,
  birthday text,
  biography text,
  PRIMARY KEY (username)
)

user_email 表

Create Table user (
  email text,
  username text,
  userid bigint,
  password text,
  name text,
  phone text,
  birthday text,
  biography text,
  PRIMARY KEY (email)

)

这些是存储库

public interface UserRepository extends ReactiveCassandraRepository<User, Long> {
}

public interface UserUsernameRepository extends ReactiveCassandraRepository<UserUsername, String> {
}

public interface UserEmailRepository extends ReactiveCassandraRepository<UserEmail, String> {
}

我可以单独保存它们,但不能同时保存

public Mono<ServerResponse> createUser(ServerRequest request) {
  Mono<User> user = request.bodyToMono(User.class);
  return ServerResponse.ok().build(userRepository.saveUser(user));
}

注册 POJO(JSON 有效负载)

public class SignUp {
  private String name;
  private String username;
  private String email;
  private String password;
}

public Mono<ServerResponse> post(ServerRequest request) {
  Mono<SignUp> signUp = request.bodyToMono(SignUp.class);
  final UUID id = UUID.randomUUID();
  return created(UriComponentsBuilder.fromPath("user/" + id).build().toUri())
    .contentType(APPLICATION_JSON)
    .body(
        fromPublisher(
            signUp.map(u -> new User(u, id)).flatMap(userManager::saveUser), User.class)
            signUp.map(u -> new UserUsername(u, id)).flatMap(userManager::saveUsername), User.class)
            signUp.map(u -> new UserEmail(u, id)).flatMap(userManager::saveEmail), User.class)
            );
}

I need help to resolve this issues. The same thing goes to delete and update 

public Mono<ServerResponse> delete(ServerRequest request) {
  String id = request.pathVariable("id");
  return personManager
    .findById(id)
    .flatMap(u -> noContent().build(userManager.deleteUser(u)))
    // User is deleted
    // How to delete UserUsername 
    // also delete UserEmail
} 

【问题讨论】:

  • 为什么要复制数据库中的数据?
  • 像 Cassandra 这样的分布式数据库需要数据复制。现在磁盘便宜了。为了改进 Cassandra 读取,我们需要复制数据,以便在发生某些故障时确保数据的可用性。

标签: java reactive-programming spring-webflux spring-data-cassandra


【解决方案1】:

您需要如下映射用户-用户名和用户-电子邮件:

Create Table user (
  username text,
  userid bigint,
  password text,
  name text,
  email text,
  phone text,
  birthday text,
  biography text,
  PRIMARY KEY (username)
)

Create Table userUsername (
  username text,
  userid bigint,
  usernameid bigint,
  password text,
  name text,
  email text,
  phone text,
  birthday text,
  biography text,
  PRIMARY KEY (userid, usernameid)
)

Create Table userEmail (
  email text,
  emailid bigint,
  username text,
  userid bigint,
  password text,
  name text,
  phone text,
  birthday text,
  biography text,
  PRIMARY KEY (userid, emailid)
)

【讨论】:

  • 我认为我的模型是正确的,但我无法通过根据用户 ID、用户名和电子邮件找到用户来解决我的需求。
猜你喜欢
  • 2021-01-20
  • 2018-08-24
  • 2022-01-14
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 2021-11-05
  • 2018-01-13
  • 2019-12-20
相关资源
最近更新 更多