我有一个Java休眠mysql项目,由于我未提供主键AUTO_INCREMENT
的值,因此查询之一一直无法插入。
我跟踪了Hibernate查询,这是Hibernate真正发送给MySql的
SET GLOBAL general_log = 'ON';
SHOW GLOBAL VARIABLES LIKE 'general_log%';
我拖了general_log文件,似乎发出了一些会话命令,例如 SET sql_mode ='STRICT_TRANS_TABLES',有些人认为我们不应该这样做。我们应该将 sql_mode 保留为空。
2019-03-22T15:16:11.207625Z 418 Query SET sql_mode='STRICT_TRANS_TABLES'
2019-03-22T15:16:11.207987Z 418 Query SHOW WARNINGS
2019-03-22T15:16:11.213624Z 418 Query SELECT @@session.transaction_isolation
2019-03-22T15:16:11.214109Z 418 Query SELECT @@session.transaction_read_only
2019-03-22T15:16:11.221148Z 418 Query SET autocommit=0
2019-03-22T15:16:11.252061Z 418 Query rollback
2019-03-22T15:16:11.252457Z 418 Query SET autocommit=1
2019-03-22T15:16:11.514489Z 418 Query SET autocommit=0
2019-03-22T15:16:11.545532Z 418 Query DELETE FROM `db1`.`table_a`
2019-03-22T15:16:11.549415Z 418 Query commit
2019-03-22T15:16:11.550861Z 418 Query SET autocommit=1
2019-03-22T15:16:11.551402Z 418 Query SET autocommit=0
2019-03-22T15:16:11.551896Z 418 Query ALTER TABLE `db1`.`table_a` AUTO_INCREMENT = 1
2019-03-22T15:16:11.567116Z 418 Query commit
2019-03-22T15:16:11.567413Z 418 Query SET autocommit=1
2019-03-22T15:16:11.568958Z 418 Query SET autocommit=0
2019-03-22T15:16:11.569947Z 418 Query INSERT INTO `db1`.`table_a` (key_reference, customer_obj_id, is_deleted) VALUES ('1ab0ccd3-3195-45eb-a65e-8ce8cf7b9808', 1, 0)
我已经在my.cnf中确认了
[mysqld]
sql-mode=""
使用MySQL Workbench连接到服务器:
SHOW VARIABLES LIKE 'sql_mode';
Variable_name sql_mode, Value=
所以我已经确认它不是来自我的服务器配置。 我如何停止休眠 SET sql_mode ='STRICT_TRANS_TABLES'?
答案 0 :(得分:0)
我认为您的INSERT问题与sql_mode
没有关系。
即使Hibernate将sql_mode设置为STRICT_TRANS_TABLES
也意味着什么?
如果无法按照交易表中的值插入值, 中止该语句。对于非事务表,中止该语句 如果值出现在单行语句或a的第一行中 多行语句。
更多详细信息here
回到您的INSERT问题
如果您使用的是Hibernate,那么您必须让某些实体说出Student之类的东西
@Entity
public class Student {
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
private long studentId;
// ...
}
现在,当您调用em.persist(student);
或另一种添加数据的方式
您不需要提供studentId
值。休眠会解决这个问题
如果这也无济于事
请在代码的数据库部分中添加实体详细信息以及如何保存记录。
答案 1 :(得分:0)
我尝试使用@GeneratedValue (strategy = GenerationType.IDENTITY)
,但是由于某些原因,它仍然无法正常工作。可能与我正在处理的旧项目的设置有关,或者可能需要较新的休眠模式。下面的代码有效,比我期望的更长。
@Entity
@Table(name = "table_a")
@GenericGenerator(name = "MyProject_Sequence_Generator", strategy = "org.hibernate.id.enhanced.TableGenerator", parameters = {
@Parameter(name = TableGenerator.TABLE_PARAM, value = "table_primary_key_lookup"),
@Parameter(name = TableGenerator.VALUE_COLUMN_PARAM, value = "next_obj_id"),
@Parameter(name = TableGenerator.SEGMENT_COLUMN_PARAM, value = "table_name"),
@Parameter(name = TableGenerator.OPT_PARAM, value = OptimizerFactory.POOL),
@Parameter(name = TableGenerator.INITIAL_PARAM, value = "1"),
@Parameter(name = TableGenerator.INCREMENT_PARAM, value = "1"),
@Parameter(name = TableGenerator.CONFIG_PREFER_SEGMENT_PER_ENTITY, value = "true") })
public class TableAModel {
}