开发者社区> 问答> 正文

如何使用JPA批注对MYSQL自动增量字段进行批注

直截了当,问题是将对象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) )

展开
收起
保持可爱mmm 2020-05-11 16:40:03 487 0
1 条回答
写回答
取消 提交回答
  • 要使用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

    2020-05-11 16:40:12
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像