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.properties
8의 경우 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에서도 이 문제가 발생했고, 이 솔루션에서는 문제가 발생하지 않았습니다.
- 프로젝트 디렉터리에 .data 디렉터리가 있으면 삭제하십시오.
- 실행 중인 도커 컨테이너의 전원을 끕니다.
- 기존 도커 컨테이너를 삭제합니다.
- 를 새로 하려면 "도커 "를 .
docker-compose up -d
「 」가 있는docker-compose.yml
일이있있 있있있다다 - 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이라는 .orders
MySql은 예약 테이블/키워드인 것 같아서 에러를 발생시켰습니다.
는 그것을 ㅇㅇㅇㅇㅇㅇㅇ로 요.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 권한이 없기 때문에 오류가 발생했습니다.
이 문제를 해결하려면
- 루트 사용자로 mysql 로그인
- '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
'prosource' 카테고리의 다른 글
Reactjs를 사용하여 스크롤 위치 가져오기 (0) | 2023.03.14 |
---|---|
Angular UI-Router "레이아웃" 상태를 만드는 방법 (0) | 2023.03.14 |
SpringBoot 통합 테스트에서 TestContainers로 데이터베이스 채우기 (0) | 2023.03.09 |
WordPress는 로그인한 사용자에게 개인 투고를 표시합니다. 이 기능을 해제하려면 어떻게 해야 합니까? (0) | 2023.03.09 |
표준 json 모듈에서는 포맷이 플로팅됩니다. (0) | 2023.03.09 |