2017-02-14 1 views
0

를 만들 때 나는 그들의 생성자/게터/세터와 그 지속 엔티티를 가지고 :JPA 매핑 예외 자식 요소

@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 

} 

는 내가 제대로 실체를 주석 한 생각하지만, 나는이 예외 받고 있어요 :

추가 또는 카이를 업데이트 할 수 없습니다를 LD 행 : 외래 키 제약 조건이 실패 이와

('치과 의사 - 응용 프로그램을' 'budgetline'CONSTRAINT 'FKn3er98a66as3vxuj1kij2q040' FOREIGN KEY ('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 어떤 외부 키 제한을하지 말았어야 때문에 내가 이해가 안 돼요. 무슨 일이 벌어지고 있는지에 대한 어떤 생각? 감사.

+0

안녕하세요, 귀하의 답변에 감사드립니다. 당신 말이 맞아요, 다른 방법으로'@ JoinColumn'을 이해 했습니다만, BudgetLine에'private Long budgetId'을 추가하려고 시도했는데 작동하지 않습니다 ... –

+0

당신은 그렇게 할 필요가 없습니다. 당신이 필요로하는 Java 코드에서만 Thge가 변경됩니다. SQL을 사용하여 테이블을 생성하고 Hibernate가 그것을 생성하지 못하도록한다면, BudgetLine 테이블에 budgetId 컬럼을 추가하고, BudgetLine.budgetd와 Budget.budgetId 사이에 외래 키 제약 조건을 생성해야한다. –

+0

예, 죄송합니다. Java 클래스에서 Hibernate를 사용하여 Java 코드에서 테이블을 자동 생성하기 때문에이 속성을 만들었습니다. 'referencedColumnName = "budgetId"'를 주석에 추가했는데 완벽하게 작동하지 않고 작동하지 않는 것 같습니다 ... –

답변

1

지도 작성 및 표 정의가 잘못되었습니다. budgetLineId 열은 BudgetLine의 고유 식별자이며 자동 생성되며 열의 조인 열/외래 키일 수 없습니다. Budget입니다. 당신은 BudgetLine 테이블에 추가 budgetId 열이 필요합니다, 당신은 외래 키 제약 조건이없는 이유 또한

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

, 나는 데이터베이스에서 데이터의 일관성을 보장 표시되지 않습니다 그냥 협회 때문에 단방향이다. BudgetLine이 아직 존재하지 않는 예산을 가리 키지 않도록 외래 키 제약 조건을 원한다.