2017-01-25 2 views
1

プロジェクトで永続性のためにHibernate/JPA 2.1を使用しています。継承マッピングを使用してマッピングされたエンティティを参照する複数のオブジェクトが挿入され、次にクエリが更新されます

@Entity 
@Table(name = "tbl_financial_instrument") 
public class FinancialInstrument { 

    @Embedded 
    private InterestRate interestRate; 

    // ... 
} 

@Embeddable 
public class InterestRate { 

    @OneToMany(fetch = FetchType.LAZY) 
    @JoinColumn(name = "ir_id") 
    private Set<InterestPaymentPlanStep> interestPaymentPlanSteps = new LinkedHashSet<>(); 

    // ... 
} 

計画段階が異なるクラスで再利用することができ、私はここに継承を使用(単一のテーブル:私はPlanStepのいくつかの次のマッピングが設定されている埋め込みフィールドinterestRateを、持っているFinancialInstrumentを、保存しようタイプ)。

@Entity 
@DiscriminatorValue("INTEREST_PAYMENT") 
public class InterestPaymentPlanStep extends PlanStep { 
    // ... 
} 

@Entity 
@Table(name = "tbl_plan_step") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "PLAN_STEP_TYPE", discriminatorType = DiscriminatorType.STRING) 
public abstract class PlanStep extends AbstractBaseObject { 

    // ... 
} 

私はFinancial InstrumentにInterestRateを入力しました。これには計画ステップが含まれています。今、私はこのコードを使用して、データベースへのすべてを持続しようとしている:

private void persistFinancialInstrument(FinancialInstrument financialInstrument) { 

    financialInstrument = financialInstrumentRepository.save(financialInstrument); 

    if (financialInstrument.getInterestRate() != null) { 
     Set<InterestPaymentPlanStep> interestRatePaymentPlanSteps = financialInstrument.getInterestRate().getInterestPaymentPlanSteps(); 
     for (PlanStep planStep : interestRatePaymentPlanSteps) { 
      planStepRepository.save(planStep); 
     } 
    } 
} 

奇妙なことは、今、私は私のクエリのログ記録をオンにしたとき、私はそれがプランの手順を永続化するために2つのクエリを実行していることがわかりということです:

insert into tbl_plan_step (creation_datetime, modification_datetime, amount, anchor_date, cap, cycle, floor, rate_add, rate_value, plan_step_type, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, 'INTEREST_PAYMENT', ?) 

2つ目:

これは最初のものであるが、私はすでにここでそれを期待しながら、それが金融商品のIDが含まれていないことに注意してください

update tbl_plan_step set ir_id=? where id=? 

なぜ2つのクエリで保存が実行されているのかわかりません。誰もこれについての説明を見つけることができますか?

+0

逆の関係も書いてみましたか? InterestPaymentPlanStepの@ManyToOne –

答えて

1

これは、PlanStepがInterestRateとの関係を持たないためです。リンクを双方向にする。

@ManyToOne 
private InterestRate interestRate 

(PlanStepで1回の挿入を実行する)。

詳細な説明はhibernate documentationを参照

+0

ありがとう:)トリックをした!埋め込み可能なオブジェクトの性質のため、今はちょっと変わっています。私は多対1の定義で埋め込み可能なクラスを使うことができないので、あなたの答えに多対1をマッピングすることはできません。エンティティクラスだけです。だから私はManyToOneプライベートFinancialInstrument financialInstrumentで終わった。 interestRateの代わりに。 – geoffreydv

関連する問題