问题描述
我正在开发Spring MVC Web应用程序,我需要使用Hibernate创建一个小镇。
@Entity
@Table(name =town)
public class TownModel {
@Id
@Column(name =townid)
@GeneratedValue
private Integer townId;
@Column(name =name)
private String townName;
@Column(name =desc)
private String townDesc;
@ManyToOne(可选= true)
@JoinColumn(name =districtid)
private DistrictModel districtModel;
}
我有另一个名为district的实体。城镇是地区的一部分,一个地区可以有多个城镇。以下是我的分区模型:
@Entity
@Table(name =district)
public class DistrictModel {
@Id
@Column(name =districtid)
@GeneratedValue
private Integer districtId;
@Column(name =name)
私有字符串名称;
@Column(name =desc)
私有字符串描述;
@OneToMany(mappedBy =districtModel,fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
private List< TownModel> townModelList;
}
我使用以下Hibernate代码保存城镇:
Session session = sessionFactory.getCurrentSession();
session.save(townModel);
但显示错误:
<$ p $警告[org.hibernate.engine.jdbc.spi.SqlExceptionHelper](http - 127.0.0.1-9090-1)SQL错误:1064,SQLState:42000
21:22:08,112错误[org.hibernate.engine.jdbc.spi.SqlExceptionHelper](http - 127.0.0.1-9090-1)您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行附近使用'desc,name'附近的正确语法值(2,'Test town desc。','Test town')')
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行
sun.reflect处使用接近'desc,name'值的正确语法(2,'Test town desc。','Test town')'' .NativeConstructorAccessorImpl.newInstance0(Native Method)〜[na:1.7.0_45]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)〜[na:1.7.0_45]
在sun。反射.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)〜[na:1.7.0_45]
在java.lang.reflect.Constructor.newInstance(Constructor.java:526)〜[na:1.7.0_45]
at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)〜[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.Util.getInstance(Util .java:360)〜[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:978)〜[com.mysql.jdbc_5.1.5。 jar:na]
在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)〜[com.mysql.jdbc_5.1.5.jar: na]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)〜[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.MysqlIO。 sendCommand(MysqlIO.java:2435)〜[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)〜[com.mysql.jdbc_5 .1.5.jar:na]
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530)〜[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql .jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907)〜[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2141)〜[ com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2077)〜[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2062)〜[com.mysql.jdbc_5.1.5.jar:na]
at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeUpdate (WrappedPreparedStatement.java:493 )〜[na:na]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:186)〜[hibernate-core-4.2.16.Final.jar:4.2.16。 Final]
...省略64个常用框架
由于使用 desc
,因为它是MySQL中的保留字,所以问题在于生成的查询中。
可能的解决方案:
- 将列的名称更改为
描述
。与name
类似。 - 更改MySQL中的配置以支持查询中列的这些类型名称。 b $ b
-
更改字段中列的名称以追加`字符(引用自):
@Column(name =`desc`)
IMO虽然选项3是一个快速和肮脏的解决方案,但我发现选项1作为将来使用数据库的最佳解决方案。
I am working on a Spring mvc web application in which I need to create a town using Hibernate. Following is my town model.
@Entity
@Table(name="town")
public class TownModel {
@Id
@Column(name="townid")
@GeneratedValue
private Integer townId;
@Column(name="name")
private String townName;
@Column(name="desc")
private String townDesc;
@ManyToOne(optional = true)
@JoinColumn(name="districtid")
private DistrictModel districtModel;
}
I have another entity named district. Town is a part of district and a district can have multiple towns. Following is my district model:
@Entity
@Table(name="district")
public class DistrictModel {
@Id
@Column(name="districtid")
@GeneratedValue
private Integer districtId;
@Column(name="name")
private String name;
@Column(name="desc")
private String description;
@OneToMany(mappedBy = "districtModel", fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
private List<TownModel> townModelList;
}
I am using following Hibernate code for saving town:
Session session = sessionFactory.getCurrentSession();
session.save(townModel);
But it shows error:
21:22:08,104 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http--127.0.0.1-9090-1) SQL Error: 1064, SQLState: 42000
21:22:08,112 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http--127.0.0.1-9090-1) 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 'desc, name) values (2, 'Test town desc.', 'Test town')' at line 1
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 'desc, name) values (2, 'Test town desc.', 'Test town')' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.7.0_45]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) ~[na:1.7.0_45]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.7.0_45]
at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[na:1.7.0_45]
at com.mysql.jdbc.Util.handleNewInstance(Util.java:377) ~[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.Util.getInstance(Util.java:360) ~[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:978) ~[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887) ~[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823) ~[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435) ~[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) ~[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530) ~[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907) ~[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2141) ~[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2077) ~[com.mysql.jdbc_5.1.5.jar:na]
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2062) ~[com.mysql.jdbc_5.1.5.jar:na]
at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:493) ~[na:na]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:186) ~[hibernate-core-4.2.16.Final.jar:4.2.16.Final]
... 64 common frames omitted
The error messages states:
The problem is in the generated query, due to the usage of desc
since it's a reserved word in MySQL.
Possible solutions:
- Change the name of your column to
description
. Do similar withname
. - Change the configuration in MySQL to support these kind of names for columns in queries.
Change the name of the column in the fields to append ` character (referenced from Creating field with reserved word name with JPA):
@Column(name="`desc`")
IMO while option 3 is a quick and dirty solution, I find option 1 as the best solution for future usage of the database.
这篇关于SQL错误:1064,SQLState:42000,同时创建新的实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!