#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 (что, я думаю, необязательно). Однако я не уверен в причине!!