java - 是否可以在 Spring Boot 中将 MongoDb 和 PostgreSql 用于同一模型?
问题描述
我已经建立了一个用户管理服务,我在其中使用 MongoDb(弹簧数据)。我有两个模型用户和角色。
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
}
在 User 中有一个角色属性,我有@Dbref到角色集合。我的问题是我想在这些模型的同一应用程序中选择使用 PostgreSql 和 MongoDb。我已经为 MongoDb 实现了这个,但我不确定如何在同一个应用程序中为 postgreSql 做这个作为一个选项。我认为的一种方法是拥有一个用户和角色接口,并为 User_mongo 模型和 User_postgre 实体构建两个不同的类(角色的方式相同)。我被困在这里,我尝试进行某些研究,但大多数时候我发现教程具有相同类型的单独数据库(两个 PostgreSql 数据库)。任何方向都受到高度赞赏。PS 我是 Spring Boot 和 Java 的新手。
到目前为止使用 Mongorepository 的我的 AddUser 控制器
@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 {
推荐阅读
- svg - 即使可聚焦设置为假,SVG 仍然可以显示?
- r - 在 data.table 中按 colSums 选择列并按 rowSums 过滤
- ruby-on-rails - ElasticSearch Rails:如果存在和将来按日期1排序,否则按日期2排序
- sql - 求和列在精度后只有 2 位数字(无舍入)
- javascript - 按下键盘提交按钮时继续显示键盘
- php - 尝试安装 Sentry 时找不到类“Sentry\ClientBuilder”
- .net-traceprocessing - .net 跟踪处理是否具有与 ETW2JSON 相同或更好的事件解析支持?
- javascript - 为什么我的 React 函数组件方法不起作用
- html - 选择框中的文本底部被截断
- python - 通过 Python 3 查找缺失的漫画章节