单个类多@OneToMany关联持久化异常:Order实体SQL语法错误排查
问题根源与解决方案
嘿,我一眼就揪出问题啦——你的Order实体对应的数据库表名被Hibernate默认设成了order,而**order是MySQL的保留关键字**!这就导致执行SQL时数据库搞不清你是在调用排序关键字,还是指表名,直接抛出语法错误。
解决方案一:给Order实体指定非关键字表名(推荐)
最稳妥的办法是给Order实体加上@Table注解,指定一个合法的表名,比如customer_order或者orders:
@Entity @Table(name = "customer_order") // 选一个不是关键字的名字就行 public class Order { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer orderId; // 顺便提一句,你这里原来的字段名是orderI,看起来像是打错了,改成orderId更合理哦 @ManyToOne(fetch=FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) @JoinColumn(name="customer_id") private Customer customer; // getter、setter等方法 }
解决方案二:强制用关键字作为表名(不推荐,兼容性差)
如果你非要用order作为表名,可以用反引号把表名括起来,让MySQL识别为表名:
@Entity @Table(name = "`order`") // 用反引号包裹表名 public class Order { // ... 其他代码 }
不过注意:不同数据库的转义符不一样(比如Oracle用双引号),这么做会降低代码的跨数据库兼容性,所以优先选方案一。
另外,检查下你的Customer实体里的集合字段名:private Set<Order> order;,这里集合名是单数order,改成复数orders会更符合代码规范,虽然这不是报错的直接原因,但能让代码更易读~
内容的提问来源于stack exchange,提问作者chandan tamang
相关产品推荐
相关产品推荐

