---
title: 5.2、关联映射
date: 2018-1-27 19:37:03
tags: 
  - 数据库
  - MongoDB
categories: 
  - MongoDB
---

在Maven项目中引入marphia的包
```xml
<dependency>
  <groupId>org.mongodb.morphia</groupId>
  <artifactId>morphia</artifactId>
  <version>1.2.0</version>
</dependency>
```
<!-- more -->
![mapping](/images/MongoDB/mapping1.png)
maven会自动引入一些其他的依赖jar包 , 否则关联映射就无法正常执行

---
#### 命令行执行
```javascript
db.user.insert({
  username:"test_user",
  role : {
    $ref:"role",
    $id:ObjectId("576d47b8cc7a1342538343fc"),
    $db:"model_db"
  }
})
```

> **说明** : 在NoSQL型数据库当中 , 并不鼓励使用类似于关系型数据库的外键关联
> 但是为了程序的查询方便 , 提供了这种程序驱动可以识别的表示形式
> 其实并没有外键关联的检查 , 与普通的文档没有任何区别

#### 使用morphia的注解实现引用

##### 多对一关联
`@Reference`注解包含的属性
+ concreteClass - 关联的目标类
+ idOnly - 只保存从表的数据ID ( 与关系型数据库的外键字段类似 )
+ ignoreMissing - 忽略不能解决的引用
+ lazy - 懒加载 , 默认是false ( 在双向关联情况下 , 如果双端都不是懒加载 , 会形成死循环 )
+ value - 在集合中存储的字段名 , 默认是类中的属性名


角色表
```java
@Entity(value="role")
public class Role {
  @Id
  private ObjectId id;
  private String roleName;
  private String remark;
//getter与setter方法
}
```
用户表
```java
@Entity(value="user")
public class User {
  @Id
  private ObjectId id;
  private String username;
  private int age;
  private boolean denger;
  
  @Reference(value="roleId",idOnly=true)
  private Role role;
//getter与setter方法
}
```
测试代码
```java
User user = new User();
user.setUsername("papapa");

Role role = new Role();
role.setRoleName("测试角色2");

user.setRole(role);
ds.save(role);//ds -> Datastore
ds.save(user);
```

![mapping](/images/MongoDB/mapping2.png)

##### 一对多关联
用法与多对一也是类似的 , 数据库中会在 **一** 的那端以数组形式保存数据
```java
@Entity(value="role")
public class Role {
  @Id
  private ObjectId id;
  private String roleName;
  private String remark;
  
  @Reference("user")
  private List<User> users;
//getter与setter方法
}
```

测试代码
```java
@Test
public void save(){
  Role role = new Role();
  role.setRoleName("测试角色2");
  User user1 = new User();
  user1.setUsername("pppp");
  
  User user2 = new User();
  user2.setUsername("oooo");
  
  List<User> users = new ArrayList<User>();
  users.add(user1);
  users.add(user2);
  userDao.save(user1);
  userDao.save(user2);
  
  role.setUsers(users);
  roleDao.save(role);
}
```
![mapping](/images/MongoDB/mapping3.png)