【问题标题】:Save document with dbref in mongodb spring-data在 mongodb spring-data 中使用 dbref 保存文档
【发布时间】:2017-05-03 10:42:45
【问题描述】:

使用 Spring-data-MongoDb。 在我们有以下文件的场景中

@Document
public class Company {
.
.
@DBRef
List<Person> personnel;
}

还有 Person 类。

@Document
public class Person {
@Id
public String id;

public String name;
.
.
}

现在,如果我在 mongodb 中保存了一些 ID 为 100 和 200 的人,那么用这些人保存公司的最佳方法是什么?

【问题讨论】:

  • 在这种情况下您似乎需要 RDB。

标签: java spring mongodb spring-data-mongodb


【解决方案1】:

您首先使用例如 MongoRepository 接口创建一个存储库。您自动连接到某些组件/您的应用程序。

然后您可以根据需要创建对象并将其保存到数据库。您只需使用嵌套的人员 pojos 创建 pojo 并调用 save。

请注意,人员需要设置一个 ID,并且应该存在于数据库中。请记住,在 mongodb 中使用 @Dbref 时没有级联!

public interface CompanyRepository extends MongoRepository<Company,String>
{

}

...

@Autowired
CompanyRepository repository

public void createCompany(String name, List<Person> persons)
{
    Company company = new Company();
    company.setName(name);
    company.setPersonnel(persons);
    repository.save(company);
}

【讨论】:

  • 难道不能在 createCompany 中完全跳过 Person 吗?只使用我的意思的人ID。根据我的理解,DBRef 意味着指向 MongoDB 中另一个文档的链接,因此由于 Person 已经存在于 db 中,只需给它 id 就足够了,它应该链接到它还是我错了?
  • 你是对的,这也适用于这个例子。 Afaik 只有 @Id 字段必须亲自设置才能完成这项工作。因此,如果您只是创建一个“空”人并将 id 设置为 100/200 它应该可以工作
  • 让我们稍等一下,看看是否有人有更好的解决方案,否则我会接受你的答案作为正确答案。
  • 更好的方法是在 Java 中完全管理它。由于您已经将人员保存到数据库中,因此您已经将它们保存在内存中,如果没有,您可以重新加载(从数据库)以某种方式将这些人员添加到公司(可能使用一些前端)并且您正在显示这些用户。因此,您应该将实际的用户对象添加到公司并保存...但是当您询问是否可以仅使用这个想法时。答案是肯定的。。
【解决方案2】:

使用懒惰

@Document
public class Company {
.
.
@DBRef(lazy=true)
List<Person> personnel;
}
And the Person class.

@Document
public class Person {
@Id
public String id;

public String name;
.
.
}

【讨论】:

    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 2017-10-31
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2017-04-16
    相关资源
    最近更新 更多