首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一对多引用由继承映射映射的实体导致插入,然后更新查询

一对多引用由继承映射映射的实体导致插入,然后更新查询
EN

Stack Overflow用户
提问于 2017-01-25 21:05:01
回答 1查看 40关注 0票数 1

我在我的项目中使用Hibernate / JPA 2.1进行持久化。我尝试保存一个FinancialInstrument,它有一个嵌入的字段interestRate,它有几个PlanStep。下面的映射是建立的:

代码语言:javascript
复制
@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<>();

    // ...
}

计划步骤可以由不同的类重用,我在这里使用继承(单表类型)。

代码语言:javascript
复制
@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 {

    // ...
}

我用一个包含计划步骤的InterestRate填充了一个金融工具。现在,我正在尝试将所有内容持久化到数据库中,我使用以下代码:

代码语言:javascript
复制
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个查询来持久化计划步骤:

这是第一个,请注意,它不包含金融工具的ID,而我已经在这里期望它:

代码语言:javascript
复制
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', ?)

第二个是:

代码语言:javascript
复制
update tbl_plan_step set ir_id=? where id=?

我不知道为什么要在两个查询中执行保存。有人能为此找到一个解释吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-25 21:21:48

这可能是因为PlanStep与InterestRate没有关系。将链接设置为双向的。

代码语言:javascript
复制
@ManyToOne
private InterestRate interestRate

在PlanStep中执行一次插入。

有关详细说明,请参阅hibernate documentation

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41852381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档