prosource

JDBC 문을 통해 "DDL 실행 오류 "변경 테이블 이벤트 드롭 외부 키 FKg0mkvgsqn8584qoql6a2rxheq" 수정 방법

probook 2023. 3. 9. 22:10
반응형

JDBC 문을 통해 "DDL 실행 오류 "변경 테이블 이벤트 드롭 외부 키 FKg0mkvgsqn8584qoql6a2rxheq" 수정 방법

MySQL 데이터베이스로 spring boot 프로젝트를 시작하려고 하는데 데이터베이스에 문제가 있습니다.어플리케이션을 기동하려고 하면 서버는 실행 중이지만 휴지 상태에서는 테이블을 작성하지 않습니다.

코드는 다음과 같습니다.

사용자 엔티티

 @Entity
   public class User {
      @Id
      @GeneratedValue(strategy = IDENTITY)
      private Long id;

      private String firstName;
      private String lastName;

      private String email;

      private String password;
      private String description;
      private String profile_photo;

      private LocalDate create;
      private LocalDate update;

      @OneToMany(mappedBy = "eventOwner")
      private List<Event> ownedEvents;

           public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getProfile_photo() {
    return profile_photo;
}

public void setProfile_photo(String profile_photo) {
    this.profile_photo = profile_photo;
}

public LocalDate getCreate() {
    return create;
}

public void setCreate(LocalDate create) {
    this.create = create;
}

public LocalDate getUpdate() {
    return update;
}

public void setUpdate(LocalDate update) {
    this.update = update;
}

public List<Event> getOwnedEvents() {
    return ownedEvents;
}

public void setOwnedEvents(List<Event> ownedEvents) {
    this.ownedEvents = ownedEvents;
}}

이벤트 엔티티

   @Entity
   @Table(name = "events")
   public class Event {

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

private Double longitude;
private Double latitude;

private String description;
private String header;

private LocalDate startData;
private LocalDate endData;
private LocalDate creat;
private LocalDate update;
private Filters filters;

@ManyToOne
@JoinColumn(name = "owner_id")
private User eventOwner;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public Double getLongitude() {
    return longitude;
}

public void setLongitude(Double longitude) {
    this.longitude = longitude;
}

public Double getLatitude() {
    return latitude;
}

public void setLatitude(Double latitude) {
    this.latitude = latitude;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getHeader() {
    return header;
}

public void setHeader(String header) {
    this.header = header;
}

public LocalDate getStartData() {
    return startData;
}

public void setStartData(LocalDate startData) {
    this.startData = startData;
}

public LocalDate getEndData() {
    return endData;
}

public void setEndData(LocalDate endData) {
    this.endData = endData;
}

public LocalDate getCreat() {
    return creat;
}

public void setCreat(LocalDate creat) {
    this.creat = creat;
}

public LocalDate getUpdate() {
    return update;
}

public void setUpdate(LocalDate update) {
    this.update = update;
}

public Filters getFilters() {
    return filters;
}

public void setFilters(Filters filters) {
    this.filters = filters;
}

public User getEventOwner() {
    return eventOwner;
}

public void setEventOwner(User eventOwner) {
    this.eventOwner = eventOwner;
}

}

그리고 이게 내 재산이야.

spring.datasource.url= jdbc:mysql://localhost:3306/some_database? 
requireSSL=false&useSSL=false
spring.datasource.username= user
spring.datasource.password= passw 
logging.level.org.hibernate.SQL= DEBUG
spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect

이것은 에러입니다.

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing 
DDL "alter table events drop foreign key FKg0mkvgsqn8584qoql6a2rxheq" via 
JDBC Statement

그리고.

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing 
DDL "create table events (id bigint not null auto_increment, creat date, 
description varchar(255), end_data date, event_type integer, max_age 
integer not null, min_age integer not null, open_to_changes bit not null, 
pets_allowed bit not null, price_range integer, smoking_allowed bit not 
null, header varchar(255), latitude double precision, longitude double 
precision, start_data date, update date, owner_id bigint, primary key (id)) 
engine=InnoDB" via JDBC Statement
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:440) [hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlStrings(SchemaCreatorImpl.java:424) [hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:315) [hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:166) [hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:135) [hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:121) [hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:155) [hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72) [hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310) [hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467) [hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939) [hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) [spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) [spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390) [spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377) [spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) [spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1804) [spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1741) [spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:576) [spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498) [spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) [spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) [spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) [spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1083) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:853) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) ~[spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) ~[spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) ~[spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]

고칠 줄 아는 사람?

spring.jpa.cryptate.ddl-auto = create-drop업데이트하도록 변경합니다.시작 시 데이터베이스가 삭제되므로 변경에 필요한 이벤트 테이블을 찾을 수 없습니다.

나의 경우, 이 예외를 받은 이유는 일부 테이블이 포스트그레용으로 예약된 이름을 가지고 있었기 때문이다.SQL(예: "좋아요" 또는 "사용자").변경된 이름:

@Table(name="likes") 

잘 작동했어요아마 누군가 같은 문제를 가지고 있을 것이다.

예약 Postgre 관련 오류인 것 같습니다.SQL 단어상위 답변(SupaMario)과 마찬가지로 내 열 이름 중 하나를 변경한 후 오류가 사라졌습니다.

@Column(name = "name", nullable = false)

로.

@Column(name = "employee_name", nullable = false)

제 경우, 이 예외가 발생한 이유는 일부 테이블이 mySQL용으로 예약된 이름을 가지고 있었기 때문입니다."order" 이름 변경:

@Column(name="orders") 

또는

예를들면

@ManyToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "fk_order",nullable = false)
private Order order;

날 위해 일했어

만 하면 .application.properties8의 경우 MySQL 8의 경우

hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

Owner는 MySQL의 예약어입니다.기본 키 대신 다른 이름을 사용하려면 이 이름을 변경하거나 주석을 사용하십시오.

참고 자료: https://dev.mysql.com/doc/refman/8.0/en/keywords.html#keywords-8-0-detailed-O

사용자 정의 이름을 사용하도록 JPA 강제 적용

@ManyToOne
@MapsId("ownerId")
@JoinColumn(
        name = "owner_id",
        foreignKey = @ForeignKey(
                name = "fkey_own_id"
                )
        ) 

변경 hibernate.cfg.xml 방언 :-org.hibernate.dialect.MySQL5InnoDBDialect OR org.hibernate.dialect.MySQL55 Dialect OR org.hibernate.dialect.MySQL55InnoDBDialect OR org.hibernate.dialect.MySQL57InnoDBDialect

속성 파일에서 라인 코드 변경:

폼:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect

수신인:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

MySQL55Dialect는 FK를 생성하지 않고 MySQL5InnoDBDialect는 FK를 생성하기 때문입니다.

도커에서 동작하고 있는 MySQL에서도 이 문제가 발생했고, 이 솔루션에서는 문제가 발생하지 않았습니다.

  1. 프로젝트 디렉터리에 .data 디렉터리가 있으면 삭제하십시오.
  2. 실행 중인 도커 컨테이너의 전원을 끕니다.
  3. 기존 도커 컨테이너를 삭제합니다.
  4. 를 새로 하려면 "도커 "를 .docker-compose up -d「 」가 있는 docker-compose.yml일이있있 있있있다다
  5. Spring Boot 앱을 다시 실행합니다.

몇 시간 동안 해결책을 찾아본 결과 Spring Boot 앱에서 Hibernate에 의해 발생한 오류와 관련된 모든 문제가 해결되었습니다.

. (PS. application.properties)라는 행이 있습니다.spring.jpa.hibernate.ddl-auto=update 수 있습니다어느 정도 영향을 줄 수 있습니다.

음, 저도 이 문제가 발생했지만, 어느 쪽의 해결책으로도 문제를 해결할 수 없었습니다.XAMPP와 함께 MySQL 데이터베이스 패키지를 사용하고 있습니다.내가 해결하려고 시도했지만 실패한 것

  • xampp\mysql\data에 있는 데이터베이스를 삭제했습니다.
  • 충돌하는 테이블의 이름을 변경했습니다.
  • 처음에 이 "spring.jpa.spring.ddl-auto=update" 설정을 그대로 두었습니다.

그래서 이 문제를 해결하기 위해 제가 한 일은요.네 것일지도 몰라

  • XAMPP 패키지를 완전히 제거하고 다시 설치했습니다.
  • 새 데이터베이스 이름을 만들었습니다.
  • 응용 프로그램 실행

친구여, 사실 내 사정은 나처럼 너의 문제를 도와줄지도 몰라.궁금한 거 있으면 댓글로 올려주세요.감사해요.

비슷한 문제에 부딪혀 SupaMario의 답변을 여기서 찾았습니다.

에는 제우 named named named이라는 .ordersMySql은 예약 테이블/키워드인 것 같아서 에러를 발생시켰습니다.

는 그것을 ㅇㅇㅇㅇㅇㅇㅇ로 요.customer_order모든 게 잘 풀렸어요

이 문제가 발견되면 클래스 속성에서 키(내 경우)와 같은 예약된 키워드를 다시 확인하십시오.

키를 mkey로 바꿨더니 다 잘 되고 있어요.

Postgre를 사용하는 모든 사용자용테이블 이름이 키워드가 아닌 경우에도 SQL과 동일한 문제가 발생합니다.다음 행을 application.properties에 입력합니다.그것은 나에게 효과가 있었다.

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

내 경우 특정 엔티티 속성에서 이 작업을 수행할 때 오류가 발생했습니다.

@Column(name ="condition", nullable = false)

이거로 바꿨어요

@Column(name ="condition_of_house", nullable = false)

그리고 그것은 잘 작동했다.

제 경우 mysql 사용자에게 REFERENCE 권한이 없기 때문에 오류가 발생했습니다.

이 문제를 해결하려면

  1. 루트 사용자로 mysql 로그인
  2. 'your_user'@'localhost'에 대한 모든 권한 부여

또는 'your_user'@'localhost'에 REFERENCE 권한을 부여하기만 하면 됩니다.

다음의 메뉴얼을 참조해 주세요.https://dev.mysql.com/doc/refman/8.0/en/grant.html

application.yml 또는 properties.properties 파일에 다음 설정 속성 행 코드를 추가합니다.

spring.jpa.hibernate.ddl-auto=update

application.properties에서 hibernate.dialect를 체크하고 테이블 이름을 변경해도(예약된 MSQL 키워드를 간섭하지 않도록 하기 위해), Hibernate가 실행 중일 때 create-and-drop에서 이 오류가 발생하였습니다.ALTER TABLE외부 키를 추가합니다.

이 문제를 해결하고 싶어서 MySQL Workbench에서 MySQL 로그를 살펴보기로 했습니다.

하지만 그때 나는 또 다른 문제에 직면했다.서버 로그에 액세스 할 수 없었습니다(에 관한 몇 가지 오류).PATH변수, 단,PATH변수는 OK였습니다).이 문제를 해결하는 방법은 여기를 참조하십시오.

진짜 문제는 유럽 환경(프랑스)에서 작업하는 문자 인코딩에서 비롯되었습니다.

이 문제는 [컨트롤 패널]> [지역]> [관리]> [시스템 로케일 변경]에서 [베타: UTF-8을 사용하여 전 세계 언어 지원]를 활성화하여 해결되었습니다.

재부팅 후 MySQL 로그에 액세스하여 무엇을 알 수 있습니까?휴지 상태에서도 에러가 발생하지 않게 되었습니다.

그래, 나도 같은 문제가 있었어.프레픽스를 추가하면 문제가 해결되었습니다.

송신원:

`
@Entity
@Table(name = "result_man")
@Proxy(lazy = false)
public class ResultManEntity {
@Id
@GeneratedValue
@Column(name = "id", unique = true, length = 128)
private long id;
private String key;
private int score;
private int index;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "result_id")
private ResultEntity result;
}`

대상:

`@Entity
@Table(name = "result_man")
@Proxy(lazy = false)
public class ResultManEntity {
@Id
@GeneratedValue
@Column(name = "id", unique = true, length = 128)
private long id;
private String _key;
private int _score;
private int _index;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "result_id")
private ResultEntity result;`

제 경우 데이터베이스에서 테이블을 삭제하면 도움이 됩니다.그러나 주의: 이것은 트레이닝 프로젝트였습니다.

언급URL : https://stackoverflow.com/questions/54504230/how-to-fix-error-executing-ddl-alter-table-events-drop-foreign-key-fkg0mkvgsqn

반응형