我有那些持久性实体及其构造函数/获取器/设置器:
@Entity
public class Budget {
@Id
@GeneratedValue
private Long budgetId;
private double totalAmount;
private BudgetStatus status;
private Instant created;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "budgetLineId")
private List<BudgetLine> budgetLines = new ArrayList<>();
// constructors / getters / setters
}
我想与此实体建立单向一对多关系:
@Entity
@Immutable
public class BudgetLine {
@Id
@GeneratedValue
private Long budgetLineId;
private String description;
private int tooth;
// constructors / getters / setters
}
我想我已经正确注释了实体,但是却遇到了这个异常:
无法添加或更新子行:外键约束失败
(“牙医应用”。“预算行”,约束“ FKn3er98a66as3vxuj1kij2q040”
外键('budgetLineId')参考'预算'('budgetId'))
使用此代码:
private List<Budget> createBudgets(Patient patient, BudgetStatus budgetStatus) {
List<Budget> budgets = new ArrayList<Budget>();
Treatment treatment = new Treatment("Implant");
treatmentRepository.save(treatment);
for (int i = 0; i < 5; i++) {
List<BudgetLine> budgetLines = new ArrayList<>();
BudgetLine budgetLine = budgetLineRepository.save(new BudgetLine("tooth", 120));
budgetLines.add(budgetLine);
Budget budget = budgetRepository
.save(new Budget(10, 10, 300, "Comments", budgetStatus, patient, treatment, budgetLines));
budgets.add(budget);
}
patient.setBudgets(budgets);
patientRepository.save(patient);
return budgets;
}
我不明白为什么在持久化
BudgetLine
实例时会遇到此异常,因为BudgetLine
表对Budget
不应有任何外键限制,因为它是单向关系。有什么想法吗?谢谢。 最佳答案
您的映射和表定义是错误的。 budgetLineId
列是BudgetLine
的唯一标识符,并且是自动生成的,不能作为budgetId
的Budget
列的联接列/外键。您需要在budgetId
表中附加一个BudgetLine
列:
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "budgetId")
private List<BudgetLine> budgetLines = new ArrayList<>();
另外,我不明白为什么您没有外键约束,以确保数据在数据库中的一致性,只是因为关联是单向的。您仍然希望使用外键约束来确保BudgetLine不会指向不存在的Budget。