首页 > 解决方案 > 使用 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")
} )

标签: javapostgresqlspring-boothibernateone-to-many

解决方案


推荐阅读