gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:17:16 24 4
gpt4 key购买 nike

我已经建立了一个用户管理服务,我在其中使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com