130 lines
2.8 KiB
Markdown
130 lines
2.8 KiB
Markdown
---
|
|
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 -->
|
|

|
|
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);
|
|
```
|
|
|
|

|
|
|
|
##### 一对多关联
|
|
用法与多对一也是类似的 , 数据库中会在 **一** 的那端以数组形式保存数据
|
|
```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);
|
|
}
|
|
```
|
|
 |