java - 是否可以在 Spring Boot 中将 MongoDb 和 PostgreSql 用于同一模型?

标签 java mongodb postgresql spring-boot

我已经建立了一个用户管理服务,我在其中使用 MongoDb( Spring 数据)。我有两个模型用户和角色。

package com.userservice.usermanagement.models;

import java.util.HashSet;
import java.util.Set;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.DBRef;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "user_data")

public class User {
    /**
     * User model
     */
    
      @Id
      private String id;

      
      private String username;

     
      private String email;

      
      private String password;
      
      private String customername;
      
      private String customerid;
      
      private String description;
      

      public String getCustomerid() {
        return customerid;
    }

    public void setCustomerid(String customerid) {
        this.customerid = customerid;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getCustomername() {
        return customername;
    }

    public void setCustomername(String customername) {
        this.customername = customername;
    }

    @DBRef
      private Set<Role> roles = new HashSet<>();

      public User() {
      }

      public User(String username, String email, String customername,String customerid,String description, String password) {
        this.username = username;
        this.email = email;
        this.customername = customername;
        this.customerid = customerid;
        this.description = description;
        this.password = password;
      }

      public String getId() {
        return id;
      }

      public void setId(String id) {
        this.id = id;
      }

      public String getUsername() {
        return username;
      }

      public void setUsername(String username) {
        this.username = username;
      }

      public String getEmail() {
        return email;
      }

      public void setEmail(String email) {
        this.email = email;
      }

      public String getPassword() {
        return password;
      }

      public void setPassword(String password) {
        this.password = password;
      }

      public Set<Role> getRoles() {
        return roles;
      }

      public void setRoles(Set<Role> roles) {
        this.roles = roles;
      }
    }
好榜样 -
package com.userservice.usermanagement.models;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "roles")
public class Role {
    /**
     * Model for role with all the attributes
     */
      @Id
      private String id;

      private URole name;

      public Role() {

      }

      public Role(URole name) {
        this.name = name;
      }

      public String getId() {
        return id;
      }

      public void setId(String id) {
        this.id = id;
      }

      public URole getName() {
        return name;
      }

      public void setName(URole name) {
        this.name = name;
      }
    }
和角色枚举器-
package com.userservice.usermanagement.models;

public enum URole {
    ROLE_USER,  
    ROLE_ADMIN
}
在用户中有一个角色属性,我有 @Dbref 到角色集合。我的问题是我想在这些模型的同一应用程序中选择使用 PostgreSql 和 MongoDb。我已经为 MongoDb 实现了这个,但我不确定如何在同一个应用程序中为 postgreSql 做这个作为一个选项。我认为的一种方法是拥有一个用户和角色接口(interface),并为 User_mongo 模型和 User_postgre 实体构建两个不同的类(角色的方式相同)。我被困在这里,我尝试进行某些研究,但大多数时候我发现教程具有相同类型的单独数据库(两个 PostgreSql 数据库)。任何方向都受到高度赞赏。 PS 我是 Spring Boot 和 Java 的新手。
到目前为止使用 Mongorepository 的我的 AddUser Controller
@PostMapping("/adduser")
//  @PreAuthorize("hasRole('ADMIN')")
    public ResponseEntity<?> registerUser(@Valid @RequestBody SignupRequest signUpRequest) {
        /*
         * This controller Creates new user based on all the entities for the user
         * 
         */
        if (userRepository.existsByUsername(signUpRequest.getUsername())) {
            return ResponseEntity
                    .badRequest()
                    .body(new MessageResponse("Error: Username is already taken!"));
        }

        if (userRepository.existsByEmail(signUpRequest.getEmail())) {
            return ResponseEntity
                    .badRequest()
                    .body(new MessageResponse("Error: Email is already in use!"));
        }

        // Create new user's account
        User user = new User(signUpRequest.getUsername(), 
                             signUpRequest.getEmail(),
                             signUpRequest.getCustomername(),
                             signUpRequest.getCustomerid(),
                             signUpRequest.getDescription(),
                             encoder.encode(signUpRequest.getPassword()));
        

        Set<String> strRoles = signUpRequest.getRoles();
        Set<Role> roles = new HashSet<>();
      
        if (strRoles == null) {
            Role userRole = roleRepository.findByName(URole.ROLE_USER)
                    .orElseThrow(() -> new RuntimeException("Error: Role is not found."));
            roles.add(userRole);
        } else {
            strRoles.forEach(role -> {
                switch (role) {
                case "admin":
                    Role adminRole = roleRepository.findByName(URole.ROLE_ADMIN)
                            .orElseThrow(() -> new RuntimeException("Error: Role is not found."));
                    roles.add(adminRole);

                    break;
                
                default:
                    Role userRole = roleRepository.findByName(URole.ROLE_USER)
                            .orElseThrow(() -> new RuntimeException("Error: Role is not found."));
                    roles.add(userRole);
                }
            });
        }

        user.setRoles(roles);
        userRepository.save(user);

        return ResponseEntity.ok(new MessageResponse("User Added successfully!"));
    }
    ```

最佳答案

我会在两个配置上使用@ConditonalOnProperty 注释(一个用于 Mongo,一个用于 PostgerSql),并在运行时添加启用的配置属性(对于您希望加载的配置)
这是一个简化的例子。

 public static void main(String[] args) {
        SpringApplication application = new SpringApplication(DemoApplication.class);
        Properties properties = new Properties();
        properties.put("databaseFoo.enabled", "true");
        application.setDefaultProperties(properties);
        application.run(args);
    }
    then on the config needed when run time is databaseFoo you can annotate the bean as such
    
        @ConditionalOnProperty(
            value="databaseFoo.enabled",
            havingValue = "true")
    public class DatabaseFooConfig {
    Then the other bean could have the following conditional properties
    
            @ConditionalOnProperty(
            value="databaseBar.nabled",
            havingValue = "false",
            matchIfMissing= true)
    public class DataBaseBarConfig {

关于java - 是否可以在 Spring Boot 中将 MongoDb 和 PostgreSql 用于同一模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64133393/

相关文章:

java - 根据用户输入计算日历月的第一天

java - 嵌套的通配符和子类型。如何理解类型何时兼容?

javascript - MongoDB 聚合的多个分组

java - Android fragment 代码问题

mongodb - 转储包含 GridFS 引用的 mongo 集合的子集?

mongodb - 如何查找Mongo中所有字段的数据类型

python - 未知 PG 数字类型 25

postgresql - 如何限制整个模式的大小?

java - 如何优化从平面文件到 BD PostgreSQL 的数据导入?

java - 创建具有空值的对象