spring-data-mongodb 对象关联 @DBRef学习 之疑问

spring-data-mongodb中,可以使用注解@DBRef来设置对象的关联,@DBRef在包org.springframework.data.mongodb.core.mapping.DBRef;

例如,如下两个关系实体:

 

Student(学生实体)
@Document(collection="student")
public class Student {
	@Id
	private String studentId;
	@Indexed(unique=true)
	private String studentName;
	private int age;
	@DBRef
	private List<Course> courses;

//setter,getter方法略
}
Course课程实体
@Document(collection="course")
public class Course {
	@Id
	private String courseId;
	@Indexed(unique=true)
	private String courseName;
//setter,getter
}


 

新建一个Student对象,将两门课程赋值给Student对象(注:这两门课程在数据库中并没有),然后保存到数据库。

		List<Course> courses = new ArrayList<Course>();
		Course math = new Course();
		Course english = new Course();
	
		math.setCourseId("c01");
		math.setCourseName("math");
		
		english.setCourseId("c02");
		english.setCourseName("english");

		courses.add(english);
		courses.add(math);
		
		Student s = new Student();
		s.setAge(21);
		s.setCourses(courses);
		s.setStudentId("2009011");
		s.setStudentName("lklk");
		
		studentService.addStudent(s);


 

按逻辑来讲,如果数据库中并不存在这两门课程,由于做了关联,在保存Student对象时,应该报错才对,可是为什么能够保存成功。保存的数据如下:

{
    "_id" : "2009011",
    "_class" : "cn.com.coolcao.springmongo.entity.Student",
    "studentName" : "lklk",
    "age" : 21,
    "courses" : [ 
        {
            "$ref" : "course",
            "$id" : "c02"
        }, 
        {
            "$ref" : "course",
            "$id" : "c01"
        }
    ]
}


 

如此可看出,@DBRef已关联成功。可是在course这个collection中并没有c02,c01这两门课程,这样做的意义何在?(集合course此时还是空的,并没任何数据)

 

对于做了关联的对象之间的保存,删除等操作,spring-data-mongodb并不作检查就直接保存,删除了,这一块我有点不明白,意义何在。这样和内嵌文档的实质区别在哪里?

 

关于查询:

如果做了关联,查询的时候会是什么样子的呢?

下面我将集合collection中插入三条数据:

/* 0 */
{
    "_id" : "c01",
    "_class" : "cn.com.coolcao.springmongo.entity.Course",
    "courseName" : "math"
}

/* 1 */
{
    "_id" : "c02",
    "_class" : "cn.com.coolcao.springmongo.entity.Course",
    "courseName" : "english"
}

/* 2 */
{
    "_id" : "c03",
    "_class" : "cn.com.coolcao.springmongo.entity.Course",
    "courseName" : "chinese"
}


 

然后进行查询Student操作:

String id = "2009011";
Student s = studentService.queryById(id);

查询出的结果是:

Student [studentId=2009011, studentName=lklk,age=21, courses=[ Course [courseId=c02, courseName=english], Course[courseId=c01, courseName=math]]]

 

也就是说,此时查询的时候,spring-data-mongodb会将关联的Course实体也查询了出来,这一点是理想中的结果。

 

针对我提出的第一点,使用了@DBRef注解做了对象关联后,在插入,删除操作时,并不检查对象之间的关联关系就直接操作了,应该如何解决这个问题。请熟知mongodb的朋友讲解一下,小弟刚开始学mongodb,还请各位不吝赐教。


 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值