由以下原因引起:java.sql.SQLSyntaxErrorException:第 1 行 'order (id)' 附近使用正确语法的 [...] 版本
Caused by: java.sql.SQLSyntaxErrorException: [...] version for the right syntax to use near 'order (id)' at line 1
此异常与
有关
spring.jpa.hibernate.ddl-auto=update
我还没有尝试保存任何数据
我认为映射是正确的,但仍然抛出异常:
org.hibernate.tool.schema.spi.CommandAcceptanceException:通过 JDBC 语句
执行 DDL "create table order (id bigint not null auto_increment, order_date date, user_id bigint, primary key (id)) engine=MyISAM" 时出错
原因:java.sql.SQLSyntaxErrorException:您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在第 1
行 'order (id)' 附近使用的正确语法
我的映射如下:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@MappedSuperclass
public abstract class BaseEntity {
@Id
@GeneratedValue(
strategy = GenerationType.IDENTITY
)
private Long id;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "Order")
@Table(name = "order")
public class Order extends BaseEntity {
private LocalDate orderDate;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderedTicket> orderedTickets = new ArrayList<>();
private Long userId;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "OrderedTicket")
@Table(name = "ordered_ticket")
public class OrderedTicket extends BaseEntity {
private Integer amount;
@OneToOne
@JoinColumn(name="ticket_id")
private Ticket ticket;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "order_id")
private Order order;
}
@Getter
@Setter
@NoArgsConstructor
@Entity(name = "Ticket")
@Table(name = "ticket")
public class Ticket extends BaseEntity {
@Enumerated(value = EnumType.STRING)
private TicketType type;
private Integer price;
private Integer totalAmmount;
private Integer inStock;
@ManyToOne(cascade = {
CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.PERSIST,
CascadeType.REFRESH
})
@JoinColumn(name = "event_id")
Event event;
@Builder
public Ticket(TicketType type, Integer price, Integer totalAmmount, Integer inStock, Event event) {
this.type = type;
this.price = price;
this.totalAmmount = totalAmmount;
this.inStock = inStock;
this.event = event;
}
}
您不应该命名您的 table ORDER,因为 ORDER 是保留的 SQL 关键字。
您可以这样做,但您将始终必须将 ORDER 括在引号中。
请查看所有保留关键字的 MySQL 手册:
ORDER
是保留字(用于ORDER BY子句)
您应该更改 table 名称,例如使用不同的 table 名称
create table customer_order (
id bigint not null auto_increment
, order_date date
, user_id bigint
, primary key (id))
engine=MyISAM"
或者如果您确实需要这个 table 名称,请在 tablename
周围使用反引号
create table `order` (
id bigint not null auto_increment
, order_date date
, user_id bigint
, primary key (id))
engine=MyISAM"
尝试用反引号将订单 table 名称括起来。否则,引擎将因保留关键字而不断抛出错误:
@Table(name = "`order`")
public class Order extends BaseEntity {
此异常与
有关spring.jpa.hibernate.ddl-auto=update
我还没有尝试保存任何数据
我认为映射是正确的,但仍然抛出异常:
org.hibernate.tool.schema.spi.CommandAcceptanceException:通过 JDBC 语句
执行 DDL "create table order (id bigint not null auto_increment, order_date date, user_id bigint, primary key (id)) engine=MyISAM" 时出错原因:java.sql.SQLSyntaxErrorException:您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在第 1
行 'order (id)' 附近使用的正确语法我的映射如下:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@MappedSuperclass
public abstract class BaseEntity {
@Id
@GeneratedValue(
strategy = GenerationType.IDENTITY
)
private Long id;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "Order")
@Table(name = "order")
public class Order extends BaseEntity {
private LocalDate orderDate;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderedTicket> orderedTickets = new ArrayList<>();
private Long userId;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "OrderedTicket")
@Table(name = "ordered_ticket")
public class OrderedTicket extends BaseEntity {
private Integer amount;
@OneToOne
@JoinColumn(name="ticket_id")
private Ticket ticket;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "order_id")
private Order order;
}
@Getter
@Setter
@NoArgsConstructor
@Entity(name = "Ticket")
@Table(name = "ticket")
public class Ticket extends BaseEntity {
@Enumerated(value = EnumType.STRING)
private TicketType type;
private Integer price;
private Integer totalAmmount;
private Integer inStock;
@ManyToOne(cascade = {
CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.PERSIST,
CascadeType.REFRESH
})
@JoinColumn(name = "event_id")
Event event;
@Builder
public Ticket(TicketType type, Integer price, Integer totalAmmount, Integer inStock, Event event) {
this.type = type;
this.price = price;
this.totalAmmount = totalAmmount;
this.inStock = inStock;
this.event = event;
}
}
您不应该命名您的 table ORDER,因为 ORDER 是保留的 SQL 关键字。
您可以这样做,但您将始终必须将 ORDER 括在引号中。
请查看所有保留关键字的 MySQL 手册:
ORDER
是保留字(用于ORDER BY子句)
您应该更改 table 名称,例如使用不同的 table 名称
create table customer_order (
id bigint not null auto_increment
, order_date date
, user_id bigint
, primary key (id))
engine=MyISAM"
或者如果您确实需要这个 table 名称,请在 tablename
周围使用反引号create table `order` (
id bigint not null auto_increment
, order_date date
, user_id bigint
, primary key (id))
engine=MyISAM"
尝试用反引号将订单 table 名称括起来。否则,引擎将因保留关键字而不断抛出错误:
@Table(name = "`order`")
public class Order extends BaseEntity {