Property是Category的子模块,是多对一的关系,所以,这里的代码,要解决的问题也就是这个。
1.pojo
@Entity
@Table(name = "property")
@JsonIgnoreProperties({
"handler","hibernateLazyInitializer"
})
public class Property {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@ManyToOne
@JoinColumn(name = "cid")
private Category category;
//省略set,get,tostring
}
在类中加上映射的对象category,并且用@ManyToOne注解修饰,然后用@JoinColumn(name = "cid")给出外键
后面的vue中接受数据的的data,也要如此设计
2.dao
public interface PropertyDAO extends JpaRepository{
Page findByCategory(Category category, Pageable pageable);
}
给出一个通过category查找对应的property的方法的声明
3.service
@Service
public class PropertyService {
@Autowired
PropertyDAO propertyDAO;
@Autowired
CategoryService categoryService;
public void add(Property bean){
propertyDAO.save(bean);
}
public void delete(int id){
propertyDAO.delete(id);
}
public Property get(int id){
return propertyDAO.findOne(id);
}
public void update(Property bean){
propertyDAO.save(bean);
}
public Page4Navigator list(int cid, int start, int size, int navigatePages) {
//Property对应分类的id
Category category = categoryService.get(cid);
Sort sort = new Sort(Sort.Direction.DESC,"id");
Pageable pageable = new PageRequest(start, size, sort);
Page pageFromJPA = propertyDAO.findByCategory(category, pageable);
return new Page4Navigator<>(pageFromJPA, navigatePages);
}
}
唯一值得一提的service中的方法就是list,因为需要根据category查找property,所以需要注入CategoryService,这也是多对一关系映射业务处理中的一个步骤
3.controller
那个跳转的controller我就不说了,跟之前的规则差不多
说一下PropertyController
@RestController
public class PropertyController {
@Autowired
PropertyService propertyService;
@GetMapping("/categories/{cid}/properties")
public Page4Navigator list(@PathVariable("cid") int cid,
@RequestParam(value = "start", defaultValue = "0")
int start,@RequestParam(value = "size", defaultValue = "5")
int size){
start = start<0?0:start;
Page4Navigator page = propertyService.list(cid, start, size, 5);
return page;
}
@GetMapping("/properties/{id}")
public Property get(@PathVariable("id") int id) {
Property bean = propertyService.get(id);
return bean;
}
@PostMapping("/properties")
public Object add(@RequestBody Property bean) {
propertyService.add(bean);
return bean;
}
@DeleteMapping("/properties/{id}")
public String delete(@PathVariable("id") int id) {
propertyService.delete(id);
return null;
}
@PutMapping("/properties")
public Object update(@RequestBody Property bean) {
propertyService.update(bean);
return bean;
}
}
这里需要额外注意的还是list方法,这里的url设计是重点,后面的vue,中的list的ajax请求的url也要如此设计
其他操作其实没有变化,只有list方法的操作是不同的
4.listProperty.html
其实代替上设计大同小异,我们主要聚焦实现多对一查询的部分,尤其是url,以及list方法的实现,这个是实现这个业务逻辑的重点
data部分,bean中多了一个category对象,这里我突然又想到了一个点,这里出现的对象的属性,其实是和pojo中映射到的属性是一致的,如果没有映射到,就不会出现,具体的理解我也没有形成自己完整的看法,等待后一步的学习吧
这里的url适合mapping绑定的
为了更方便看出整个流程这里,我再把listCategory中的链接代码放出来
get方法,先根据请求的url的cid得到property所属的category对象,然后查询list出所有的property属性,这里有一个想到了,就是ajax的axios的数据绑定机制,下去以后还要查阅资料思考
add方法呢,就是根据已经绑定的bean的category属性,以及提交的bean数据,创建一个新的bean然后post上去,然后初始化掉
deleteBean呢,就直接在当前页面调用函数就可以了,突然想到一个点,因为这里实现的是双向的绑定,所以也不用刷新,只要后台删除掉一个property,页面就会自动减少一个bean,感觉自己好像感受到一点点双向绑定的意思了
最后给一下跳转eidt页面的链接,我们就进入下一部分代码
可以看出,传递了id的属性
5.editProperty.html
还是先看vue的部分
这里我想到了一个点,就是如果想通过页面把一个参数传到下一个参数,在下一个页面如果想用到这个就要通过我们自己封装的函数getUrlParams()传入想要从url中提取的PathVariabel来获取
这里在获取到id以后,还是通过查后端的代码,通过ajax请求get到这个property的属性,完成bean的绑定,其实在update框中其实绑定了bean的name属性,默认显示的也是这个,然后实现了一个update方法
在还有一个点,就是vue中的data需要封装哪些的问题,这个其实是由我们需要的数据对象的集合决定的,就好比这里,只需要提取出一个category,然后给出一个bean(只对一个bean进行操作就够了)用来提交就可以了,至于bean中有哪些属性,不知道为何没有给出?是因为上一步已经给出了么,但在进行get方法时,也用到了vue.bean.category啊?这里下一步还需要思考。
属性关系就暂时写到这里,不懂得地方还有很多,自己也才在这条路上刚刚开始
谢谢观看