java - 使用 spring boot 和 postgres 的休眠 oneToMany 问题
问题描述
我在使用 Spring Boot 时遇到了休眠和 postgres 的问题。当我运行我在 postgres 中看到的应用程序时,会记录这些错误(没有任何数据引导程序):
2021-06-25 13:55:31.057 UTC [81] ERROR: constraint "uk_j1xiaxeat9b5r1qs27ei0t2a6" of
relation "process_template_base_environmental_impact" does not exist
2021-06-25 13:55:31.057 UTC [81] STATEMENT: alter table
process_template_base_environmental_impact drop constraint
UK_j1xiaxeat9b5r1qs27ei0t2a6
2021-06-25 13:55:31.062 UTC [81] ERROR: constraint "uk_9568qjc94suvuskoi9o2li3er" of
relation "process_template_elementary_flow_template" does not exist
2021-06-25 13:55:31.062 UTC [81] STATEMENT: alter table
process_template_elementary_flow_template drop constraint
UK_9568qjc94suvuskoi9o2li3er
2021-06-25 13:55:31.064 UTC [81] ERROR: constraint "uk_dy1ej2j9qxeoq6ca641tpfxr5" of
relation "process_template_flow_template" does not exist
2021-06-25 13:55:31.064 UTC [81] STATEMENT: alter table
process_template_flow_template drop constraint UK_dy1ej2j9qxeoq6ca641tpfxr5
我有一个名为 ProcessTemplate 的实体,其中 ProcessTemplateId 作为复合键,在 ElementaryFlowTemplate、BaseEnvironmentalImpact 和 FlowTemplate 上有 3 个级联。
流程模板:
@Data
@Entity
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@Table(name = "process_template")
public class ProcessTemplate {
@EmbeddedId
@EqualsAndHashCode.Include
private ProcessTemplateId id;
@ManyToOne
@JoinColumn(name = "fk_process_base", referencedColumnName = "id")
private ProcessBase processBase;
@ManyToOne
@JoinColumn(name = "fk_reference_flow_base", referencedColumnName = "id")
private FlowBase referenceProduct;
@OneToMany(cascade = CascadeType.ALL)
private Set<BaseEnvironmentalImpact> baseEnvironmentalImpacts;
@OneToMany(cascade = CascadeType.ALL)
@OrderBy("impactsContribute DESC" )
private Set<FlowTemplate> flowsTemplate;
@OneToMany(cascade = CascadeType.ALL)
@OrderBy("impactsContribute DESC" )
private Set<ElementaryFlowTemplate> elementaryFlowsTemplate;
@ManyToOne
@JoinColumn(name = "fk_source_info", referencedColumnName = "id")
private SourceInfo sourceInfo;
@Column(name = "version")
@Version
private Long version;
}
流程模板 ID:
@Embeddable
public class ProcessTemplateId implements Serializable {
@Column(name = "process_base_id")
private UUID processBaseId;
@Column(name = "reference_product_id")
private UUID referenceProductId;
public ProcessTemplateId() {
}
public ProcessTemplateId(UUID processBaseId, UUID referenceProductId) {
this.processBaseId = processBaseId;
this.referenceProductId = referenceProductId;
}
public UUID getProcessBaseId() {
return processBaseId;
}
public UUID getReferenceProductId() {
return referenceProductId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof ProcessTemplateId)) return false;
ProcessTemplateId that = (ProcessTemplateId) o;
return Objects.equals(getProcessBaseId(), that.getProcessBaseId()) &&
Objects.equals(getReferenceProductId(), that.getReferenceProductId());
}
@Override
public int hashCode() {
return Objects.hash(getProcessBaseId(), getReferenceProductId());
}
}
抽象流模板:
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractFlowTemplate {
@Id
@EqualsAndHashCode.Include
private String id;
@Enumerated(EnumType.STRING)
private FlowType flowType;
@ManyToOne
@JoinColumn(name = "fk_source_info", referencedColumnName = "id")
private SourceInfo sourceInfo;
@Column(name = "version")
@Version
private Long version;
}
基本流模板:
@Data
@Entity
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
@Table(name = "elementary_flow_template")
public class ElementaryFlowTemplate extends AbstractFlowTemplate {
@ManyToOne
@JoinColumn(name = "fk_elementary_flow_base", referencedColumnName = "id")
private ElementaryFlowBase elementaryFlowBase;
}
FlowTemplate(linkedProcessTemplate 不是与 ProcessTemplate 的双向关系,而是另一种单向关系,因为每个 flowTemplate 都有到另一个 ProcessTemplate 的链接):
@Data
@Entity
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
@Table(name = "flow_template")
public class FlowTemplate extends AbstractFlowTemplate {
@ManyToOne
@JoinColumn(name = "fk_flow_base", referencedColumnName = "id")
private FlowBase flowBase;
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumns({@JoinColumn(name = "process_base_id", referencedColumnName =
"process_base_id"),
@JoinColumn(name = "reference_product_id", referencedColumnName =
"reference_product_id")})
private ProcessTemplate linkedProcessTemplate;
}
基础环境影响:
@Data
@Entity
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@Table(name = "base_environmental_impact")
public class BaseEnvironmentalImpact {
@Id
@EqualsAndHashCode.Include
private String id;
private double value;
@ManyToOne
@JoinColumn(name = "fk_methodology", referencedColumnName = "id")
private Methodology methodology;
@ManyToOne
@JoinColumn(name = "fk_impact_category", referencedColumnName = "id")
private ImpactCategory impactCategory;
@ManyToOne
@JoinColumn(name = "fk_impact_indicator", referencedColumnName = "id")
private ImpactIndicator impactIndicator;
@ManyToOne
@JoinColumn(name = "fk_source_info", referencedColumnName = "id")
private SourceInfo sourceInfo;
@Column(name = "version")
@Version
private Long version;
//ref
@ManyToOne
@JoinColumn(name = "fk_elementary_flow_base")
private ElementaryFlowBase elementaryFlowBase;
@ManyToOne
@JoinColumns({
@JoinColumn(
name = "process_base_id",
referencedColumnName = "process_base_id"),
@JoinColumn(
name = "reference_product_id",
referencedColumnName = "reference_product_id")
})
private ProcessTemplate processTemplate;
}
正如我所写的,我不明白为什么我有一个错误日志,可能我在关系或级联中犯了一个错误,但我无法找出问题所在。如果我导入数据,它们似乎正确插入,所以我无法理解问题。在此先感谢您的帮助。
已解决,编辑:
我只解决了 ProcessTemplate-BaseEnvironmentalImpact 添加 mappedBy 的错误。
我不包含架构,因为我认为它是自动生成的,我在应用程序属性中包含这些参数:
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true
spring.jpa.hibernate.ddl-auto = create-drop
logging.level.org.hibernate = ERROR
spring.jpa.generate-ddl = true
我还解决了其他问题,添加:
@JoinColumns({
@JoinColumn(name = "fk_pt_process_base_id", referencedColumnName = "process_base_id"),
@JoinColumn(name = "fk_pt_reference_product_id", referencedColumnName = "reference_product_id")
} )
解决方案
推荐阅读
- wordpress - 如何将 2 个选择字段(组合框)添加到 woocommerce 结帐页面?
- java - 我将如何获得这个自动生成的 id 的值我希望它们显示在我的 recyclerview 中
- microsoft-edge - 如何更改 Microsoft Edge 加载项扩展的“发布者显示名称”?
- python - 无法在数据库中执行更新功能
- android - 如何保留多个活动之间的共享元素转换 - 在 API30 中被破坏?
- r - 是否可以在 Excel 或 R 中只保留数值并将所有值同时更改为分钟?
- bots - 如何通过 Telegram Bot API 发送文档
- c++ - 在 TreeMix 程序中抛出“std::logic_error”实例后调用终止
- android - Jetpack compose,添加到合成后自动关注 TextField
- excel - Excel Application.OnTime 按计划不工作