--- title: 5.2、关联映射 date: 2018-1-27 19:37:03 tags: - 数据库 - MongoDB categories: - MongoDB --- 在Maven项目中引入marphia的包 ```xml org.mongodb.morphia morphia 1.2.0 ``` ![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 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 users = new ArrayList(); users.add(user1); users.add(user2); userDao.save(user1); userDao.save(user2); role.setUsers(users); roleDao.save(role); } ``` ![mapping](/images/MongoDB/mapping3.png)