【问题标题】:spring.jpa.hibernate.ddl-auto=update property alters the foreign key every timespring.jpa.hibernate.ddl-auto=update 属性每次都会改变外键
【发布时间】:2019-05-02 06:43:19
【问题描述】:

我正在使用 spring.jpa.hibernate.ddl-auto=update 属性来更新架构。

根据我的理解,如果我们对实体进行更改,那么表架构就会更新。

但是在每次为外键执行 alter 命令时,在 spring boot 应用程序启动时。

以下是实体。

@Entity
@Table(name = "feedback")
@Data
public class Feedback implements Serializable {

    private static final long serialVersionUID = -6420805626682233375L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "study_id")
    @JsonIgnore
    private Study study;

    @ManyToOne(fetch= FetchType.EAGER)
    @JoinColumn(name="user_id", nullable = false)
    private User user;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "feedback_date", nullable = false)
    private Date feedbackDate;

    @Size(max = 1000)
    @Column(name = "feedback", length = 1000)
    private String feedback;

}

在实体中,您可以看到我有以下两个属性,用于在 spring boot 应用程序首次启动时创建外键:

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "study_id")
@JsonIgnore
private Study study;

@ManyToOne(fetch= FetchType.EAGER)
@JoinColumn(name="user_id", nullable = false)
private User user;

因此,当我每次重新启动应用程序或保存代码时,即使我没有更改该关系(属性),外键约束也会发生变化。

2018-12-05 18:44:12.027  INFO 22736 --- [  restartedMain] c.d.smartviewer.SmartViewerApplication   : Starting SmartViewerApplication on LAPTOP-F95LLCU3 with PID 22736 (D:\Sagar_\SVN\SmartViewer\target\classes started by ASUS in D:\Sagar_\SVN\SmartViewer)
2018-12-05 18:44:12.027 DEBUG 22736 --- [  restartedMain] c.d.smartviewer.SmartViewerApplication   : Running with Spring Boot v2.0.6.RELEASE, Spring v5.0.10.RELEASE
2018-12-05 18:44:12.027  INFO 22736 --- [  restartedMain] c.d.smartviewer.SmartViewerApplication   : No active profile set, falling back to default profiles: default
2018-12-05 18:44:13.356  INFO 22736 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1329 ms
Hibernate: alter table annotation add constraint FK7hwy1g5myfk7grmm2j7faqggd foreign key (parent_id) references annotation (id)
Hibernate: alter table feedback add constraint FKfxt8nk3jikofi3x40bsjd00vt foreign key (study_id) references study (id)
Hibernate: alter table feedback add constraint FK7k33yw505d347mw3avr93akao foreign key (user_id) references user (id)
Hibernate: alter table hospital add constraint FK3922fhj7qnyc3bw5x8xl6m6xc foreign key (contact_1) references contact (id)

如果我不更改外键实体属性,我应该更改什么以不执行外键的alter命令?

【问题讨论】:

  • 你能详细解释一下吗?
  • 请查看更新后的问题了解更多详情。
  • 请查看我的回答
  • 你找到答案了吗?

标签: spring hibernate spring-boot jpa


【解决方案1】:

约束是数据库架构定义的一部分。 约束是对表的数据列实施的规则。这些用于限制可以进入表的数据类型。这保证了数据库中数据的准确性和可靠性。约束可以在列级别或表级别。列级约束仅应用于一列,而表级约束应用于整个表。

约束的种类有:

  • NOT NULL - 确保列不能有 NULL 值。
  • DEFAULT - 在未指定列时为列提供默认值。
  • UNIQUE - 确保列中的所有值都不同。
  • 主键 - 唯一标识数据库表中的每一行/记录。
  • FOREIGN KEY - 唯一标识任何给定数据库表中的行/记录。
  • CHECK CONSTRAINT - CHECK 约束确保列中的所有值都满足特定条件。
  • INDEX - 用于快速创建和检索数据库中的数据。

问:这个限制在休眠中是可选的还是取消更新?

A : 不,它不是可选的,它是关系实体所必需的。

如有必要,您还可以在数据库中定义此约束以在运行时更改,但请注意不推荐。

我认为这是hibernate每次根据以下链接更改的错误(同样的问题):

https://discourse.hibernate.org/t/manytoone-alter-table-query-is-generating-every-time-when-inserting-a-value/1162/6

【讨论】:

  • 在给定的链接上他们发现了同样的问题并停止讨论。
  • 是的,因为我认为这个问题必须在下一个版本中解决,如果您没有找到更好的答案,请标记为答案
猜你喜欢
  • 2022-08-11
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 2017-10-13
  • 2020-11-04
  • 2021-07-10
相关资源
最近更新 更多