好长时间没有从零开始写项目,这次写软件工程的实验时,发现自己又对这个东西的概念模糊了,就复习了一下,并记录一下方便以后复习。
查询了一段时间,得到了一个简单容易理解的解释
mappedBy表示声明自己不是一对多的关系维护端,由对方来维护,是在一的一方进行声明的。mappedBy的值应该为一的一方的表名。
但是这说的是一对多的关系,当然,多对多也可以理解为多个一对多嘛,好像也能解释通,但还是想了解的更准确一些。
在Stack Overflow上找到一个和我 问题相似的
翻译一下上面的解释:
如果关联是双向的,则一方必须是所有者,另一方必须是反向端(即在更新关联表中的关系值时将忽略它):
所以,具有mappedby属性的边是相反的边。没有mappedby属性的一方是所有者。
(mappedy在Foo中)
所有者侧是Hibernate所查看的哪一个关联存在的方。因此,例如,如果在Bar的foo集合中添加foo,hibernate将在表中插入一个新行。相反,如果在Foo的bar集合中添加一个bar,则数据库中不会修改任何内容。
尝试了对上述结论进行验证,但发现并无法验证,如此多的赞,可以肯定他的结论一定是正确的,只能说明自己理解的有问题或者测试方法有问题,代码如下
假设Klass和Teacher两个实体,他们的关系为多对多;
@Entity
public class Teacher {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany(mappedBy = "teacherList")
private List<Klass> klassList = new ArrayList<>();
}
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
class TeacherRepositoryTest {
@Autowired
KlassRepository klassRepository;
@Autowired
TeacherRepository teacherRepository;
@Test
public void test() {
// 新建两个teacher
Teacher teacher1 = new Teacher();
Teacher teacher2 = new Teacher();
teacher1 = teacherRepository.save(teacher1);
teacher2 = teacherRepository.save(teacher2);
// 新建一个klass
Klass klass1 = new Klass();
klass1 = klassRepository.save(klass1);
// 在klassList中中插入teacher
List<Teacher> teacherList = klass1.getTeacherList();
teacherList.add(teacherRepository.findById(teacher1.getId()).get());
klass1.setTeacherList(teacherList);
klassRepository.save(klass1);
Teacher teacher = teacherRepository.findById(teacher2.getId()).get();
// 在teacherList中插入klass
List<Klass> klassList = teacher.getKlassList();
klassList.add(klass1);
teacher.setKlassList(klassList);
// 使用断点查看 发现数据全都插进去了
Teacher teacher3 = teacherRepository.findById(teacher.getId()).get();
}
}
希望有大神能解答一下。
前段时间看《on java 8》解答了自己很多在java中的疑惑,虽然对现在看到的部分又感到了困难,但总的来说java的知识比以前更加的系统了,也许spring的相关知识自己也应该找本书或教程来系统的学习一下了,总感觉现在的会的特别的散乱,很多方面都知道一点,但又不是特别清晰。
@ManyToMany(mappedBy = “foo”)(Stack Overflow的问题)
mappedBy的具体使用及其含义