0

When running the application I get a org.hibernate.PersistentObjectException error from MockData. What is causing this? Are my cascadetypes wrong?

org.hibernate.PersistentObjectException: detached entity passed to persist

The products are created and added after the categories, so the category should exist?

Product.java

@Entity
@Data
@Table(name = "product")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "manufacturer")
    private String manufacturer;

    @Column(name = "price")
    private double price;

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "category_id")
    private Category category;

    public Product(String name, String manufacturer, double price, Category category) {
        this.name = name;
        this.manufacturer = manufacturer;
        this.price = price;
        this.category = category;
    }

    public Product() {
    }

}

Category.java

@Entity
@Data
@Table(name = "category")
public class Category {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    @OneToMany(mappedBy = "category", cascade = CascadeType.ALL)
    private List<Product> products;

    public Category(String name) {
        this.name = name;
    }

    public Category() {
    }
}

MockData.java

@Component
class MockData {

    private final ProductRepository productRepository;
    private final CategoryRepository categoryRepository;

    @Autowired
    public MockData(ProductRepository productRepository, CategoryRepository categoryRepository) {
        this.productRepository = productRepository;
        this.categoryRepository = categoryRepository;

        loadData();
    }

    private void loadData() {

        Category IT = new Category("IT");
        Category beauty = new Category("Beauty");
        Category food = new Category("Food");

        categoryRepository.save(IT);
        categoryRepository.save(beauty);
        categoryRepository.save(food);

        Product computer = new Product("Computer", "Dell", 5000, IT);
        Product computer2 = new Product("Computer2", "HP", 5000, IT);
        Product eyeliner = new Product("Eyeliner", "Chanel", 100, beauty);
        Product hamburger = new Product("Angus", "Burger King", 100, food);

        productRepository.save(computer);
        productRepository.save(computer2);
        productRepository.save(eyeliner);
        productRepository.save(hamburger);
    }
}
Lithicas
  • 3,003
  • 4
  • 17
  • 27
  • 1
    I already answered a similar question here: https://stackoverflow.com/questions/49554459/jpa-onetomany-manytoone-relationship-not-working-what-am-i-missing/49555424#49555424 My guess? Try initializing your `products` collection – HBo Apr 16 '18 at 13:09
  • Possible duplicate of [Detached entity passed to persist error](https://stackoverflow.com/questions/27672337/detached-entity-passed-to-persist-error) – crizzis Apr 16 '18 at 13:10

1 Answers1

0

Changing mockdata to the following solved the problem:

@Component
class MockData {

    private final ProductRepository productRepository;
    private final CategoryRepository categoryRepository;

    @Autowired
    public MockData(ProductRepository productRepository, CategoryRepository categoryRepository) {
        this.productRepository = productRepository;
        this.categoryRepository = categoryRepository;

        loadData();
    }

    private void loadData() {

        Category IT = new Category("IT");
        Category beauty = new Category("Beauty");
        Category food = new Category("Food");

        Product computer = new Product("Computer", "Dell", 5000, IT);
        Product computer2 = new Product("Computer2", "HP", 5000, IT);
        Product eyeliner = new Product("Eyeliner", "Chanel", 100, beauty);
        Product hamburger = new Product("Angus", "Burger King", 100, food);

        IT.setProducts(Arrays.asList(computer, computer2));
        beauty.setProducts(Collections.singletonList(eyeliner));
        food.setProducts(Collections.singletonList(hamburger));

        categoryRepository.save(IT);
        categoryRepository.save(beauty);
        categoryRepository.save(food);

        productRepository.save(computer);
        productRepository.save(computer2);
        productRepository.save(eyeliner);
        productRepository.save(hamburger);
    }

Products are created and added to categories before being saved.

Lithicas
  • 3,003
  • 4
  • 17
  • 27