如何解决双向关系在OneToMany上返回空集,并且仅在ManyToOne上起作用
我有2个实体,类别和要素,每个类别都有一个或多个要素。
在创建类别及其特征时,获取新类别将在features属性上返回一个空集。
@PostMapping("/sub")
@PreAuthorize("hasRole('ROLE_admin')")
public HttpEntity<CategoryDTO> createSubCategory(@Valid @RequestBody CreateCategory createCategory)
{
Category category = categoryService.create(createCategory,mainCategoryService.one(createCategory.getMainCategory_id()));
featureService.bulkCreate(createCategory.getFeatures(),category);
return ResponseEntity.status(HttpStatus.CREATED).body(modelMapper.map(category,CategoryDTO.class));
}
这是我发送的数据:
{"name":"SUB","mainCategory_id":1,"features":{"F1":"SLIDER","F2":"CHECKBOX"}}
这是控制器返回的数据:
{"id":2,"name":"SUB","mainCategory":{"id":1,"name":"CATEGORY"},"features":[]}
如您所见,功能为空。
这是创建具有以下功能的类别的测试:
@Test
public void testIfAdminCanCreateSubCategory_expect201AndMainCategoryIdEqualsTheAssociatedOne() throws Exception {
String category = "{\"name\" : \"CATEGORY\"}";
String sub = "{\"name\":\"SUB\",\"mainCategory_id\":1,\"features\":{\"F1\":\"SLIDER\",\"F2\":\"CHECKBOX\"}}";
mockMvc().with(keycloakAuthenticationToken().authorities("ROLE_admin")).perform(post("/categories").content(category).contentType("application/json"))
.andDo(print())
.andDo(r -> mockMvc().with(keycloakAuthenticationToken().authorities("ROLE_admin"))
.post(sub,"/categories/sub")
.andExpect(status().isCreated())
.andExpect(jsonPath("$.mainCategory.id").value(1))
.andDo(print())
// .andExpect(jsonPath("$.features[0]").value("SLIDER"))
);
//featureService.all().forEach( f -> System.out.println(f.getCategory().getId()));
}
在对最后一行进行注释时,它会打印类别ID(在返回的数据中显示为2),这意味着ManyToOne正在工作,但OneToMany却不在。
我的模特:
@Entity
@EntityListeners( AuditingEntityListener.class )
@Data
public class Category {
@Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id;
....
@OneToMany(cascade = CascadeType.ALL,mappedBy = "category",fetch = FetchType.LAZY)
Set<Feature> features = new HashSet<>();
}
@Entity
@Data
public class Feature {
@Id @GeneratedValue private Long id;
private String name;
private FeatureType type;
@ManyToOne Category category;
}
categoryService中的create方法:
@Override
public Category create(CreateCategory createCategory,MainCategory mainCategory) {
Category category = new Category();
category.setName(createCategory.getName().toUpperCase());
category.setMainCategory(mainCategory);
return categoryRepository.save(category);
}
featureService中的bulkCreate方法:
@Override
public Feature create(String feature,FeatureType type,Category category) {
Feature f = new Feature();
f.setName(feature);
f.setType(type);
f.setCategory(category);
return featureRepository.save(f);
}
@Override
public void bulkCreate(Map<String,FeatureType> features,Category category) {
features.forEach( (name,type) -> create(name,type,category));
}
myDTO:
@Data
public class CategoryDTO {
private Long id;
private String name;
private MainCategoryDTO mainCategory;
private Set<FeatureDTO> features;
}
@Data
public class FeatureDTO {
private Long id;
private String name;
private FeatureType type;
}
@Data
public class MainCategoryDTO {
private Long id;
private String name;
}
编辑1 :
我在我的categoryService上添加了一个设置类别功能的方法。
@Override
public Category addFeatures(Category category,List<Feature> features) {
category.setFeatures(features);
return categoryRepository.save(category);
}
在我的控制器上,我添加了注释行,以便可以将要素关联到类别
@PostMapping("/sub")
@PreAuthorize("hasRole('ROLE_admin')")
public HttpEntity<CategoryDTO> createSubCategory(@Valid @RequestBody CreateCategory createCategory)
{
Category category = categoryService.create(createCategory,mainCategoryService.one(createCategory.getMainCategory_id()));
#category = categoryService.addFeatures(category,featureService.bulkCreate(createCategory.getFeatures(),category));
return ResponseEntity.status(HttpStatus.CREATED).body(modelMapper.map(category,CategoryDTO.class));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。