有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring:嵌套实体保存空值问题

我是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的存储库的服务。没有任何商业逻辑

类别服务类别:

@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);
    }

产品服务类:

@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或其他前端应用添加产品时,产品的类别没有设置(我用json设置category_id)。但在数据库中,products表的category_id列值为空。 json string

我还遇到了延迟获取类型和json问题。但首要问题是

谢谢你的帮助


共 (0) 个答案