Каскад JPA постоянно не работает

#hibernate #jpa

#переход в спящий режим #jpa

Вопрос:

У меня есть два класса: расходы и категория. Расходы могут иметь несколько категорий. Я хочу реализовать каскадное сохранение всех категорий (дочерних) с расходами (родительских). Но не удается достичь этого.В сохраняющейся записи расходов записи категории не создаются. Пожалуйста, дайте мне знать, что я делаю неправильно. Вот мои классы:

 @Entity
@Table(name="EXPENDITURE")
public class Expenditure {

    private Long id;

    @OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE}, mappedBy="expenditure")
    private Set<Category> associatedCategories = new HashSet<Category>();   

    public Expenditure() {  }

    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="EXPENDITURE_ID")
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }

    public void addCategory(Category category)
    {
        this.associatedCategories.add(category);
        category.setExpenditure(this);      
    }
}

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

    @Id @GeneratedValue
    @Column(name="CATEGORY_ID")
    private Long id;
    private String name;

    @ManyToOne(targetEntity=Expenditure.class)
    private Expenditure expenditure;

    public Category(){}
    public Category(String name)
    {
        this.name = name;
    }
    public Category(String name,String description)
    {
        this.name = name;
    }
    @Column(name="NAME")
    public String getName() {
        return name;
    }       

    public Expenditure getExpenditure() {
        return expenditure;
    }
    public void setExpenditure(Expenditure expenditure) {
        this.expenditure = expenditure;
    }
  

Ответ №1:

Попробуйте добавить

 @ManyToOne(targetEntity=Expenditure.class)
@JoinColumn(name="parentExpenditureId")   // or whatever column name exists in your database schema
private Expenditure expenditure;
  

А также не путайте типы доступа к полю и свойству в ваших классах сущностей.

Комментарии:

1. Спасибо Satadru за ваш ответ.. Я смог решить свою проблему, переместив аннотацию идентификатора на уровень поля в классе расходов. Это сработало без добавления JoinColumn (что, я думаю, необязательно). Однако я не уверен в причине!!