直截了当,问题是将对象Operator保存到MySQL DB中。在保存之前,我尝试从该表中进行选择并起作用,因此与数据库的连接也是如此。
这是我的Operator对象:
@Entity public class Operator{
@Id @GeneratedValue private Long id;
private String username;
private String password;
private Integer active;
//Getters and setters... } 为了保存,我使用JPA EntityManager的persist方法。
这是一些日志:
Hibernate: insert into Operator (active, password, username, id) values (?, ?, ?, ?) com.mysql.jdbc.JDBC4PreparedStatement@15724a0: insert into Operator (active,password, username, id) values (0, 'pass', 'user', ** NOT SPECIFIED **) 我的看法是,问题是具有自动增量的配置,但我不知道在哪里。
尝试了一些我在这里看到的技巧: Hibernate不尊重MySQL auto_increment主键字段,但是这些都不起作用
如果需要任何其他配置文件,我将提供它们。
DDL:
CREATE TABLE operator
( id
INT(10) NOT NULL AUTO_INCREMENT, first_name
VARCHAR(40) NOT NULL, last_name
VARCHAR(40) NOT NULL, username
VARCHAR(50) NOT NULL, password
VARCHAR(50) NOT NULL, active
INT(1) NOT NULL, PRIMARY KEY (id
) )
要使用MySQL AUTO_INCREMENT列,您应该使用一种IDENTITY策略:
@Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; AUTO与MySQL一起使用时,您将获得以下内容:
@Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; 实际上等于
@Id @GeneratedValue private Long id; 换句话说,您的映射应该有效。但是Hibernate应该忽略idSQL插入语句中的列,事实并非如此。某处一定存在某种不匹配。
您是否在Hibernate配置中指定了MySQL方言(可能是MySQL5InnoDBDialect或MySQL5Dialect取决于您使用的引擎)?
另外,谁创建了表格?您可以显示相应的DDL吗?
后续行动:我无法重现您的问题。使用的代码,你的实体,您的 DDL,Hibernate会与MySQL以下(预期)SQL:
insert into Operator (active, password, username) values (?, ?, ?) 请注意id,如预期的那样,上述语句中没有该列。
综上所述,您的代码,表定义和方言是正确且一致的,应该可以使用。如果不适合您,则可能是某些内容不同步(执行干净的构建,仔细检查构建目录等)或其他错误(请检查日志中是否有可疑内容)。
关于方言,或 之间的唯一区别是,后者在生成DDL时会添加到表对象中。使用一个或另一个不会更改生成的SQL。MySQL5DialectMySQL5InnoDBDialectENGINE=InnoDB来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。