Skip to content
Advertisement

Why am i getting a NullPointerException when trying to save an entity to a list?

Here is my database structure:

enter image description here

When I make a REST call to user_product with an intent to update the product value I keep on getting a null pointed exception. My assumption is that the problem lies in ServiceImpl though no matter what I change the error still consists.

My serviceImpl:

public void update(UserProductVO userProductVO) {

        UserProduct userProduct = new UserProduct();

        userProduct.setId(new UserProductId(userProductVO.getProduct().getId(), userProductVO.getUser().getId()));
        userProduct.setUser(userProductVO.getUser());
        userProduct.setProduct(userProductVO.getProduct());

        UpdatedProduct updatedProduct = new UpdatedProduct(userProductVO.getAmountOfNewProducts());
        updatedProductRepository.save(updatedProduct);

        userProduct.getUpdatedProducts().add(updatedProduct);  
        userProductRepository.save(userProduct);

        Product product = productRepository.getById(userProductVO.getProduct().getId());
        product.setAmount(product.getAmount() + userProductVO.getAmountOfNewProducts());
        productRepository.save(product);
    } 

Eror log says that the problem is here:

userProduct.getUpdatedProducts().add(updatedProduct)

I would appreciate any kind of clue where I might be messing up. Thanks in advance.

Edit:

My UserProduct class:

@Entity
@Table(name = "user_product")
public class UserProduct {

    @EmbeddedId
    private UserProductId id;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("userId")
    @JsonBackReference(value = "userJ")
    private User user;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("productId")
    @JsonBackReference(value = "productJ")
    private Product product;

    @OneToMany(
            mappedBy = "userProduct",
            cascade = CascadeType.ALL,
            orphanRemoval = true
    )
    @JsonManagedReference(value = "userProductJ")
    private List<UpdatedProduct> updatedProducts;

    public UserProduct() {
    }

    public UserProduct(UserProduct user, UserProduct product, int amountOfNewProducts) {
    }

    public UserProduct(User user, Product product, List<UpdatedProduct> updatedProducts) {
        this.user = user;
        this.product = product;
        this.updatedProducts = updatedProducts;
    }

..getters/setters/hashcode/equals

Edit2:

My UpdatedProduct class:

@Entity
@Table(name = "updated_product")
public class UpdatedProduct {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "amount_of_new_products")
    private int amountOfNewProducts;

    @Column(name = "updated_on")
    private Date updatedOn = new Date();

    @ManyToOne(fetch = FetchType.LAZY)
    @JsonBackReference(value = "userProductJ")
    private UserProduct userProduct;

    public UpdatedProduct() {
    }

    public UpdatedProduct(int amountOfNewProducts) {
        this.amountOfNewProducts = amountOfNewProducts;
    }

Advertisement

Answer

You would have to initialize the UserProduct class with an empty list, not null:

public class UserProduct {

    private List<UpdatedProduct> updatedProducts = new ArrayList<>();

    // rest of the fields

}

All the annotations were omitted for brevity.

User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement