Получение MySQLSyntaxErrorException с Hibernate Spatial и MySQL 5.6

0

Я использую следующий стек: Hibernate 5.2.10.FINAL(hibernate-spaces, hibernate-java8) MySQL 5.6.38 (также тестировался на последних 5,7 с одинаковыми результатами) querydsl-apt, querydsl-jpa, querydsl-sql-spaces
Все это основано на Spring Boot.

Я пытаюсь сохранить этот простой класс в моей БД:

@Entity
public class ParkingPlace extends AbstractEntity {

@Column(name = "location", nullable = false, columnDefinition = "Point")
private Point geoLoc;

private String address;
private String city;
private String name;
private String desc;

private int capacity;
private int freePlacesLeft;

@ManyToOne
@JoinColumn(name = "owner_id")
private Owner owner;
}

AbstractEntity:

@MappedSuperclass
public abstract class AbstractEntity implements Serializable, Cloneable {

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

@Version
private int version;
}

У меня также есть этот интерфейс репозитория:

@NoRepositoryBean
public interface JpaQueryDslPredicateRepository<T, ID extends Serializable>
    extends QueryDslPredicateExecutor<T>, JpaRepository<T, ID> {
@Override
List<T> findAll(OrderSpecifier<?>... orders);

@Override
List<T> findAll(Predicate predicate);

@Override
List<T> findAll(Predicate predicate, OrderSpecifier<?>... orders);

@Override
List<T> findAll(Predicate predicate, Sort sort);
}

И мой ParkingPlaceRepository:

public interface ParkingPlaceRepository
    extends JpaQueryDslPredicateRepository<ParkingPlace, Long> {}

Последний важный бит - это свойства, которые я использую:

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect
spring.jpa.show-sql=true
spring.datasource.platform=mysql
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
logging.level.org.hibernate.type=TRACE

Я также пробовал эти диалекты: MySQL5SpatialDialect, MySQL56InnoDBSpatialDialect (устарел, но использовался в проекте, на котором я основываюсь), MySQLSpatialDialect.

Я пытаюсь заполнить таблицу исходным набором данных с помощью этой функции:

    private static void addPlaceToRepo(ParkingPlaceRepository repo, GeometryFactory factory, double lat, double lon, String city, String address, String name, int capacity) {
    ParkingPlace parkingPlace = new ParkingPlace();

    parkingPlace.setGeoLoc(factory.createPoint(new Coordinate(lat, lon)));
    parkingPlace.setCity(city);
    parkingPlace.setAddress(address);
    parkingPlace.setName(name);
    parkingPlace.setCapacity(capacity);

    repo.save(parkingPlace);
}

К сожалению, приложив все усилия, я все равно получаю такие ошибки:

Hibernate: alter table order drop foreign key FKbb5wakyppwqmfuhp53p3jvs5u
gru 19, 2017 9:51:15 PM org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException
WARN: GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement
...
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order drop foreign key FKbb5wakyppwqmfuhp53p3jvs5u' at line 1

Здесь говорится, что таблица фактически не создана, и я видел во время отладки в MySQL Workbench, что это не так:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'ppclone.parking_place' doesn't exist

Но почему? Это создание-падение, должно работать.

Полный журнал можно увидеть здесь. Я буду рад за вашу помощь!

Теги:
spring-boot
syntax-error
entity
hibernate-spatial

2 ответа

0
Лучший ответ

Я нашел решение благодаря этой SO-нити. Ответ: desc - зарезервированное ключевое слово в MySQL, измените имя поля или укажите имя столбца на sth else, чем "desc"!

0

Вы должны аннотировать свой класс сущности следующим образом:

    @Entity
    @Table(name = "parking_place")
    public class ParkingPlace extends AbstractEntity {
    ...
      @Column(name = "name")
      private String name;
    ...
    }

@Сущность

@Entity этот класс в качестве компонента сущности, поэтому он должен иметь конструктор без аргументов, который отображается с хотя бы защищенной областью.

@Таблица

@Table позволяет указать детали таблицы, которые будут использоваться для сохранения объекта в базе данных.

@column

Аннотации @Column используются для указания деталей столбца, в который будет отображаться поле или свойство.

проверьте это для более подробной информации нажмите здесь

  • 0
    Извините за поздний ответ. Решение, которое вы предоставили, не работает. Класс, помеченный аннотациями @Entity, @Table и @Column, получает имена, которые вы упомянули по умолчанию. Хотя я знаю это, я проверил и подтвердил, что это все еще не работает. Я все еще получаю эту неловкую ошибку о неправильном синтаксисе SQL. У вас есть идеи, что можно сделать, чтобы решить эту проблему?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню