【发布时间】:2021-01-15 14:27:19
【问题描述】:
我是 JPA 和 Spring 的初学者。也是我在这里的第一个问题。所以,对不起我的错误。我正在练习简单的场景作为开始。我有两个实体作为产品和类别,具有双向多对一/一对多关联。
类别类:
@Entity
@Table(name = "categories")
@NoArgsConstructor
@AllArgsConstructor
@Data
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Long.class)
public class Category implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name", length = 50, nullable = false)
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "category")
private List<Product> products = new ArrayList<Product>();
}
产品类别:
@Table(name = "products")
@NoArgsConstructor
@AllArgsConstructor
@Data
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Long.class)
public class Product implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "title", nullable = false, length = 50)
private String title;
@Column(name = "price", precision = 4, scale = 2, nullable = false)
private Double price;
@Column(name = "quantity", nullable = false)
private int quantity;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "category_id", foreignKey = @ForeignKey(name = "FK_product_category"))
private Category category;
}
CategoryRepository 和 ProductRepository 都是从 JpaRepository 实现的。 带有@Query 注解的方法签名很少。
使用带有@Autowired 的存储库的服务。没有任何业务逻辑。
CategoryService 类:
@Transactional
public class CategoryService implements IRepositoryService<Category, Long> {
private ICategoryRepository categoryRepository;
@Autowired
public CategoryService(ICategoryRepository categoryRepository) {
this.categoryRepository = categoryRepository;
}
@Override
public List<Category> findAllOrderById() {
return categoryRepository.findAllOrderById();
}
@Override
public Category findById(Long id) {
return categoryRepository.findById(id).orElseThrow(EntityNotFoundException::new);
}
@Override
public List<Category> findByForeignKey(Long categoryId) {
return null;
}
@Override
public void add(Category category) {
category.getProducts().forEach(product -> product.setCategory(category));
categoryRepository.save(category);
}
@Override
public void update(Category category) {
categoryRepository.save(category);
}
@Override
public void deleteById(Long id) {
categoryRepository.deleteById(id);
}
ProductService 类:
@Transactional
public class ProductService implements IRepositoryService<Product, Long>{
@Autowired
private IProductRepository productRepository;
@Override
public List<Product> findAllOrderById() {
return productRepository.findAllOrderById();
}
@Override
public Product findById(Long id) {
return productRepository.findById(id).orElseThrow(EntityNotFoundException::new);
}
@Override
public List<Product> findByForeignKey(Long categoryId) {
return productRepository.findByCategoryId(categoryId);
}
@Override
public void add(Product entity) {
productRepository.save(entity);
}
@Override
public void update(Product entity) {
productRepository.save(entity);
}
@Override
public void deleteById(Long id) {
productRepository.deleteById(id);
}
}
最终,两个实体都有单独的 restcontroller 类。 我正在从 Postman 添加一个只有名称的类别,所以产品为空(这部分是正常的)。但是当我从 Postman 或其他前端应用程序添加产品时,没有设置产品的类别(我正在使用 json 设置 category_id)。但在数据库中,products 表的 category_id 列值为空。 json string
我也遇到了延迟获取类型和 json 问题。但主要问题是第一位的。
感谢您的帮助。
【问题讨论】:
-
你在你的 json 有效载荷上发送什么?你也可以发布你的控制器吗?
-
对于您的惰性获取类型问题,请随时提出另一个问题
标签: java json spring hibernate