# SpringBoot-Projects spring5-recipe-app-mysql 是用的mvc和关系型数据库 spring5-mongo-recipe-app-integration-testing-mongodb 用的是MVC和NoSQL spring5-reactive-mongo-recipe-app-intro-to-webtest-client 变成reactive,用的是webflux和MongoDB,因为只有MongoDB支持reactive spring-rest-client-examples-spring-webclient 是 consume restAPI 和使用Jackson,给出了两种方式,一是restTemplete,block的,另一种是WebClient,reactive的 -------------- -------------- 关于Hibernate: 不管双向还是单向的,表的结构都是不变的,哪个表存ID做外键都是定死的,唯一不同的是写class时是否多一个field要写(mappedBy的filed),这个主要影响到是否eager loading,但无论那个field写还是不写都不会存在DB中 注意JoinColumn后边写的是数据库中的名字,而MappedBy跟的是class中的名字 JoinColumn总是数据库中存field,mappedBy总是不存的field 一般OneToOne单向双向都行,OneToMany 和 ManyToMany双向 ManyToMany需要多一个join table,这时原来的两个表中都不存被当做外键的field,这时被当做外键的field存在join table中,这时两个表虽然是对称的但还是一个写JoinColumn,一个写mappedBy 是否Cascade要看删一个对另一个的影响 ------------ @OneToOne(cascade = CascadeType.ALL) // by default no operations are cascaded @JoinColumn(name = "instructor_detail_id") private InstructorDetail instructorDetail; // 不存的field,单向就不写 @OneToOne(mappedBy = "instructiorDetail") // refer to instructorDetail property in Instructor class, using information from Intructor class @JoinColumn private Instructor instructor; ------------------------ @ManyToOne @JoinColumn(name = "instructor_id") private Instructor instructor; // 不存的field,这是双向的情况,单向很奇怪,不用记 @OneToMany(mappedBy = "instructor") // refer to "instuctor" property in Course class. Look at the instructor property in the Course class, use information from the Course class @joinColumn to help find associated courses for instructor private List<Course> courses; --------------- ManyToMany可以写成 @ManyToMany @JoinTable(name = "recipe_category", joinColumns = @JoinColumn(name = "recipe_id"), inverseJoinColumns = @JoinColumn(name = "category_id")) private Set<Category> categories = new HashSet<>(); @ManyToMany(mappedBy = "categories") private Set<Recipe> recipes; 也可以写成 @ManyToMany @JoinTable(name = "recipe_category", joinColumns = @JoinColumn(name = "recipe_id"), inverseJoinColumns = @JoinColumn(name = "category_id")) private Set<Category> categories = new HashSet<>(); @JoinTable(name = "recipe_category", joinColumns = @JoinColumn(name = "category_id"), inverseJoinColumns = @JoinColumn(name = "recipe_id")) @ManyToMany(mappedBy = "categories") private Set<Recipe> recipes; 更具体的见spring5-recipe-app-mysql 包含model中包含一些辅助函数用作双向