MongoDB DBRef列表在Spring Boot中返回null

时间:2019-07-13 18:44:23

标签: java mongodb spring-boot nosql

我正在尝试使用Spring Boot在MongoDB中创建数据库。我想创建两个集合,一个DbConnections集合和一个Configuration集合。我想做的是DbConnections集合中的每个连接都有其自己的Configurations,就像使用外键的SQL引用一样。我试图使用@DBRef注释来做到这一点:

@Document(collection = "connections")
public class DbConnection {
    @Transient
    public static final String SEQUENCE_NAME = "connection_sequence";
    @Id
    private long id;
    private String username;
    private String password;
    private String connectionUrl;
    private long fkIdUsuario;
    @DBRef(db = "configurations")
    private List<Configuration> configurations;

    public DbConnection() {
    }

    public DbConnection(String username, String password, String connectionUrl) {
        this.username = username;
        this.password = password;
        this.connectionUrl = connectionUrl;
    }

    public long getId() {
        return id;
    }

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

    public List<Configuration> getConfigurations() {
        return configurations;
    }

    public void setConfigurations(List<Configuration> configurations) {
        this.configurations = configurations;
    }

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

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

    public String getConnectionUrl() {
        return connectionUrl;
    }

    public void setConnectionUrl(String connectionUrl) {
        this.connectionUrl = connectionUrl;
    }

    public long getFkIdUsuario() {
        return fkIdUsuario;
    }

    public void setFkIdUsuario(long fkIdUsuario) {
        this.fkIdUsuario = fkIdUsuario;
    }
}

和配置类:

@Document(collection = "configurations")
public class Configuration {
    @Transient
    public static final String SEQUENCE_NAME = "config_sequence";
    @Id
    private long id;
    private int fkIdConnection;
    private String name;
    private String query;
    private BasicDBObject values;
    private BasicDBObject result;

    public Configuration() {
    }

    public Configuration(long id, int fkIdConnection, String name, String query, BasicDBObject values, BasicDBObject result) {
        this.id = id;
        this.fkIdConnection = fkIdConnection;
        this.name = name;
        this.query = query;
        this.values = values;
        this.result = result;
    }

    public int getFkIdConnection() {
        return fkIdConnection;
    }

    public void setFkIdConnection(int fkIdConnection) {
        this.fkIdConnection = fkIdConnection;
    }

    public Map getValues(){
        if(null != values){
            return values.toMap();
        }
        return null;
    }

    public void setValues(){
        this.values = new BasicDBObject(values);
    }

    public Map getResult(){
        if(null != result){
            return result.toMap();
        }
        return null;
    }

    public void setResult(){
        this.result = new BasicDBObject(result);
    }

    public long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.query = query;
    }
}

我将这样的数据保存在控制器中: 对于DbConnectionsController:

@PostMapping(value = "/conexion")
    public DbConnection addConnection(@RequestBody DbConnectionModel dbConnectionModel){
        DbConnection dbConnection = new DbConnection(dbConnectionModel.getUsername(), dbConnectionModel.getPassword(), dbConnectionModel.getConnectionUrl());
        dbConnection.setFkIdUsuario(getIdUsuario());
        return dbConnectionRepository.save(dbConnection);
    }

以及配置控制器的保存方法:

@PostMapping
    public Configuration agregarConfiguracion(@RequestBody Configuration configuration){
        configuration.setId(sequenceGeneratorService.generateSequence(Configuration.SEQUENCE_NAME));

        return configurationRepository.save(configuration);
    }

现在,当我保存一个Connection时,它在mongo对象中没有字段configurations,而当我创建一个新的Configuration时,它仍然没有显示我尝试使用DbConnection请求来获取DbConnections对象,但是GET的{​​{1}}字段显示为空。为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:0)

DBRef返回空数组时,我遇到类似的问题。几个有助于我诊断的步骤:

1)您的2个收藏集connectionsconfigurations是否保存在2个单独的数据库中?如果不是,则需要在(db = "configurations")之后删除@DBRef

@DBRef
private List<Configuration> configurations;

2)直接连接到数据库时,您能够找到对象吗?我使用Robot 3T(一种GUI工具)直接查看Mongo DB,以检查所保存数据的形状。确保您的connections设置正确,并且每个configurations的{​​{1}}也应显示如下:

connection

3)您可以单步进入类org.springframework.data.mongodb.core.convert.DefaultDbRefResolver方法fetch()。 (我正在使用具有相同版本的spring-boot-starter-data-mongodb依赖性的springboot 2.1.6.RELEASE)

configurations: [
  {
    "$ref": "configurations",
    "$id": ObjectId("asdfadsgasdfasdfa")
  }
]

请确保@Override public Document fetch(DBRef dbRef) { if (LOGGER.isTraceEnabled()) { LOGGER.trace("Fetching DBRef '{}' from {}.{}.", dbRef.getId(), StringUtils.hasText(dbRef.getDatabaseName()) ? dbRef.getDatabaseName() : mongoDbFactory.getDb().getName(), dbRef.getCollectionName()); } StringUtils.hasText(dbRef.getDatabaseName()); return getCollection(dbRef).find(Filters.eq("_id", dbRef.getId())).first(); } 的所有属性(例如,collectionName,db,id)正确,否则将无法找到相关的对象。