我有那些持久性实体及其构造函数/获取器/设置器:

@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的唯一标识符,并且是自动生成的,不能作为budgetIdBudget列的联接列/外键。您需要在budgetId表中附加一个BudgetLine列:

@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "budgetId")
private List<BudgetLine> budgetLines = new ArrayList<>();


另外,我不明白为什么您没有外键约束,以确保数据在数据库中的一致性,只是因为关联是单向的。您仍然希望使用外键约束来确保BudgetLine不会指向不存在的Budget。

10-05 18:25