2017-02-14 7 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'、制約 'FKn3er98a66as3vxuj1kij2q040' FOREIGN KEY( 'budgetLineId')REFERENCES [予算]( '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を使用してテーブルを自動生成するため、プロパティを作成しました。あなたのアノテーションに 'referencedColumnName =" budgetId "'を追加しました。それはうまく動作していないと完璧に動作しています... –

答えて

1

あなたのマッピングとテーブル定義は間違っています。 budgetLineId列は、BudgetLineの一意の識別子であり、自動生成されます。budgetId列の結合列/外部キーは、Budgetです。あなたは外部キー制約を持っていないだろう、なぜ私はちょうど関連するので、データベース内のデータの一貫性を保証し、表示されていない、また

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

:あなたはBudgetLineテーブルに追加のbudgetId列を必要とします単方向です。 BudgetLineが存在しない予算を指していないことを保証するために、外部キー制約が依然として必要です。