我有以下JPA实体类(示例案例)。一栋房子属于一条街。一条街有很多房子。
@Entity
public class House {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Integer id;
public String name
@ManyToOne
public Street street;
}
@Entity
public class Street {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Integer id;
@OneToMany(mappedBy="street")
public Set<House> houses;
}
我将生成类型设置为identity,它应该自动分配一个新ID。
在创建一个拥有新街道的新房子时,我必须先创建并坚持街道,然后是House。这是因为我没有将CascadeType设置为PERSIST,因此必须手动完成[1]。但是,在插入新创建的街道时:
Street street = new Street();
entityManager.persist(street);
Hibernate / JPA生成以下SQL查询:
insert into Street default values
MySQL不喜欢。
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 'default values' at line 1
任何想法为什么?我正在使用Java 6,MySQL 5.0.67和Hibernate实现的JPA(版本3.2.1.ga)。
[1] EJB 3 in Action pages 318-319
答案 0 :(得分:13)
标准SQL为INSERT
:
INSERT INTO <Table Name> DEFAULT VALUES
这是合法的SQL语法,例如,Microsoft SQL Server,PostgreSQL和SQLite支持,但不支持Oracle,IBM DB2或MySQL。
MySQL支持其他语法来实现相同的结果:
INSERT INTO <Table Name> () VALUES ()
INSERT INTO <Table Name> (col1, col2, col3) VALUES (DEFAULT, DEFAULT, DEFAULT)
在Hibernate中,你应该正确地configure SQL方言,并且由Hibernate来为目标RDBMS品牌生成有效的SQL。
import org.hibernate.cfg.Configuration;
Configuration cfg = new Configuration();
cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");
您还可以通过将名为hibernate.properties
的文件放在类路径的根目录中来指定属性。
答案 1 :(得分:13)
如果您的SQL语句中没有错误,那么您可能需要检查表列名,因为它可以包含Mysql使用的预定义名称;例如'column',它不能用作表列名
答案 2 :(得分:7)
您可能遇到此异常的另一种情况是您将单词保留为表的列。例如,'to'和'from'不适合MySQL的clumn名称。这显然是Hibernate中的错误,它不检查这样的列,而且即使没有创建表也不会继续工作。
答案 3 :(得分:0)
确保spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect具有正确的MySQL版本