如何使用 JPA 注释注释 MYSQL 自动增量字段

2022-08-31 08:16:43

直截了当地说,问题是将对象运算符保存到MySQL数据库中。在保存之前,我尝试从此表中进行选择,并且它有效,因此连接到db也是如此。

这是我的操作员对象:

@Entity
public class Operator{

   @Id
   @GeneratedValue
   private Long id;

   private String username;

   private String password;


   private Integer active;

   //Getters and setters...
}

为了保存,我使用JPA的方法。EntityManagerpersist

以下是一些日志:

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 **)

在我看来,问题是自动增量的配置,但我不知道在哪里。

尝试了我在这里看到的一些技巧:休眠不尊重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`)
)

答案 1

要使用MySQL列,您应该使用一种策略:AUTO_INCREMENTIDENTITY

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

这是您在与MySQL一起使用时会得到的:AUTO

@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

这实际上等效于

@Id @GeneratedValue
private Long id;

换句话说,您的映射应该有效。但是 Hibernate 应该省略 SQL insert 语句中的列,事实并非如此。某处一定存在一种不匹配。id

您是否在Hibernate配置中指定了MySQL方言(可能或取决于您使用的引擎)?MySQL5InnoDBDialectMySQL5Dialect

另外,谁创建了该表?您能显示相应的 DDL 吗?

后续工作:我无法重现您的问题。使用实体DDL的代码,Hibernate使用MySQL生成以下(预期的)SQL:

insert 
into
    Operator
    (active, password, username) 
values
    (?, ?, ?)

请注意,如上所述,上述语句中缺少该列。id

总而言之,您的代码,表定义和方言是正确和连贯的,它应该有效。如果它不适合您,也许某些内容不同步(执行干净的构建,仔细检查构建目录等),或者其他内容只是错误(检查日志中是否有任何可疑内容)。

关于方言,或 之间的一区别是后者在生成 DDL 时添加到表对象中。使用其中一个不会更改生成的 SQL。MySQL5DialectMySQL5InnoDBDialectENGINE=InnoDB


答案 2

使用MySQL,只有这种方法对我有用:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

Pascal在他的答案中陈述的其他2种方法对我不起作用。


推荐