【问题标题】:Insert data in several table using single JPA query使用单个 JPA 查询在多个表中插入数据
【发布时间】:2019-04-19 13:07:42
【问题描述】:

我想使用多个表为风险过滤器创建 JPA 查询。我有这些表,我想用它们来存储数据:

风险过滤器:

@Entity
@Table(name = "risk_filters")
public class RiskFilters implements Serializable {

    private static final long serialVersionUID = -31232741713890134L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", unique = true, updatable = false, nullable = false)
    private int id;

    @Column(length = 4)
    private Integer terminal_id;

    @Column(length = 255)
    private String filter_class;

    @Column(name = "FILTER_SETTINGS", columnDefinition = "TEXT", length = 65535)
    private String filter_settings;

    @Column(length = 4)
    private Integer position;

    @Column(length = 4)
    private Integer parent_id;

    @Column
    private LocalDateTime created_at;

    @Column
    private TemporalType updated_at;
    .....
}

风险参数:

@Entity
@Table(name = "risk_parameters")
public class RiskParameters implements Serializable {

    private static final long serialVersionUID = 6828168899788931021L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", unique = true, updatable = false, nullable = false)
    private int id;

    @Column(length = 4)
    private Integer payment_transaction_id;

    @Column(length = 32)
    private String name;

    @Column(length = 128)
    private String value;

    @Column
    private LocalDateTime created_at;

    @Column
    private LocalDateTime updated_at;
    ....
}

风险详情:

@Entity
@Table(name = "risk_details")
public class RiskDetails implements Serializable {

    private static final long serialVersionUID = 6122869200132217334L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", unique = true, updatable = false, nullable = false)
    private int id;

    @Column(length = 4)
    private Integer payment_transaction_id;

    @Column(length = 32)
    private String service_name;

    @Column(length = 64)
    private String name;

    @Column(length = 512)
    private String value;
    .....
}

如何通过单次插入将数据插入这些实体并通过单选获取数据?

我想使用 JPA 来获取和插入数据。

【问题讨论】:

  • 你能解释一下所有表之间的依赖关系吗?
  • SQL 中的 INSERT 插入到单个表中,而不是多个表中。和?发布您尝试过的内容以及“问题”是什么? (除了你没有任何关系,所以将 JPA 用于不适合的事情)
  • @GauravRai1512 我有一个主表 RiskFilters 和附加的 RiskParameters 和 RiskDetails。为了存储许多配置值,我需要使用 SQL one SQL 查询才能使用它们。你能为他们提议插入和选择吗?
  • 您正在使用对象关系映射器,其目的是避免手动创建 SQL 语句。然后,您应该重新定义您的问题,清楚地解释实体之间的关系。

标签: java jpa spring-data-jpa spring-data jpa-2.0


【解决方案1】:

如果表之间有关系(risk_filters,risk_parameters & risk_details),即主键外键关系,则可能。

假设 risk_filtersrisk_parametersrisk_details 是一对一的关系,那么 Entity 会是这样的

@Entity
@Table(name = "risk_filters")
public class RiskFilters implements Serializable {

private static final long serialVersionUID = -31232741713890134L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", unique = true, updatable = false, nullable = false)
private int id;

@Column(length = 4)
private Integer terminal_id;

@Column(length = 255)
private String filter_class;

@Column(name = "FILTER_SETTINGS", columnDefinition = "TEXT", length = 65535)
private String filter_settings;

@Column(length = 4)
private Integer position;

@Column(length = 4)
private Integer parent_id;

@Column
private LocalDateTime created_at;

@Column
private TemporalType updated_at;

@OneToOne
@JoinColumn(name="risk_filter_id", nullable=false)
private RiskParameters riskParameters;

@OneToOne
@JoinColumn(name="risk_filter_id", nullable=false)
private RiskDetails riskDetails;
.....
}

以及调用 save 方法仅保存 RiskFilters 实体,如下所示。

riskFilterObject.setRiskDetails(riskDetailsObject);
riskFilterObject.setRiskParamarets(riskParametersObject);
repository.save(riskFilterObject);// update 3 tables
repository.save(riskDetailsObject); // update only risk_details table
repository.save(riskParametersObject);// update only risk_parameters table

更新:

选择怎么样?你能告诉我如何实现 select from all 实体?

RiskFilters filters = riskFiltersRepository.findOne(id);
// 用于完整的网络 RiskFilters 实体对象

RiskParameter param = riskParameterRepository.findOne(id);
// 仅用于 RiskParameter 实体对象

RiskDetails details = riskDetailsRepository.findOne(id);
// 仅适用于 RiskDetails 实体对象

【讨论】:

  • 是的,但我有 2 个过滤器和 8 个设置过滤器。对于不同的情况,我必须使用不同的表格。
  • 如果你想单独保存 R.Param & R.Details 你可以这样做,它不会影响 Risk_filter 因为我们没有双向映射。
  • 好的,你能在我的原始帖子中向我展示使用我的实体的 JPA 示例吗?
  • 选择怎么样?你能告诉我如何从所有实体中实现选择吗?
  • 有没有办法使用JOIN?
猜你喜欢
  • 2015-02-24
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 2011-08-01
相关资源
最近更新 更多