外键是设计数据库时经常用到的概念,那么Spring Data JPA设计外键怎么设计?
Entity
设计E-R图,这里我是在写一个相册和图片之间的关系。
相册:
@Entity
public class Album {
@Id //标识主键
@GeneratedValue(strategy = GenerationType.AUTO) //自增字段
private long albumId;
private long userId;
private String name;
//相册之于图片,一对多,级联设置为相册删除图片删除,被Picture实体albumid映射
@OneToMany(cascade = CascadeType.ALL,mappedBy = "albumId")
@JsonManagedReference //少的一方管理映射,将在测试结果中看出
private List<Picture> pictures;
//定义枚举写到数据库实际类型为int值
@Enumerated(EnumType.ORDINAL)
private Category category;
@Enumerated(EnumType.ORDINAL)
private ACLType acl;
}
图片:
@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
/**
*防止懒惰加载异常应加一句上面的注解,防止用时加载还未完成
类似:
No serializer found for class org.hibernate.proxy.pojo?
**/
public class Picture {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long pictureId;
private long userId;
@ManyToOne //图片之于相册,多对一
@JoinColumn //抑制ORM建造多余表
@JsonBackReference //设置少的一方管理集合,属性名于mappedBy相对应
private Album albumId;
private String name;
private String url;
private boolean approved;
}
repository
自定义实现超出讨论范围,所以repository都相当简单:
@Repository
public interface AlbumRepository extends JpaRepository<Album,Long> {
}
@Repository
public interface PictureRepository extends JpaRepository<Picture,Long> {
}
controller
写几个端点,来验证一下:
@RestController
public class AlbumController {
Logger logger= LoggerFactory.getLogger(AlbumController.class);
@Autowired
AlbumRepository albumRepository;
//创建相册
@PostMapping("/createAlbum")
public void createAlbum(@RequestBody ModelAlbum album){
logger.info(album.toString());
Album albumtemp=album.adapter();
albumRepository.save(albumtemp);
}
//获取相册列表
@GetMapping("/getAlbums")
public List<Album> getAlbums(){
return albumRepository.findAll();
}
}
@RestController
public class PictureController {
Logger logger= LoggerFactory.getLogger(PictureController.class);
@Autowired
PictureRepository pictureRepository;
@Autowired
AlbumRepository albumRepository;
//这里的代码有点糟糕,不过看一下
@PostMapping("/createPictureInfo")
public long createPictureInfo(@RequestBody Picture picture){
logger.info(modelPicture.toString());
Picture picture1=pictureRepository.save(picture);
return picture1.getPictureId();
}
@GetMapping("/getPicture")
public Picture getPicture(@RequestParam("picId")long id){
return pictureRepository.getOne(id);
}
@GetMapping("/albumContent")
public List<Picture> findAlbumPicture(@RequestParam("albumid")long albumid){
return albumRepository.getOne(albumid).getPictures();
}
}
Test
像这样传入数据
默认Spring boot RestController使用JSON作为默认格式
注意到picture中没有相册信息,因为它是多的一方,我们上面将关系委托给少的一方。
在少的一方album会看到图片集合的信息。