使用Hibernate时如何通过注解防止MySQL出现重复记录
问题核心原因
你遇到的重复插入相同aid记录的根本原因是数据库的Alien表没有将aid字段设为主键,没有唯一约束,所以允许重复值插入。你虽然在实体类上加了@Id注解,但实际表结构没有对应上主键约束。
具体修正步骤
步骤1:修正hibernate.cfg.xml的错误配置
你现有配置里有两处明显错误:
show_sql的配置格式错误,原有写法无法生效,修改为正确格式:
<property name="hibernate.show_sql">true</property>
- 方言适配问题:你使用的是MySQL 8.x版本,替换原有方言为MySQL8专属方言,确保表结构生成时自动添加主键、支持InnoDB引擎:
<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
修改后的完整hibernate.cfg.xml示例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="hibernate.connection.password">cosmonauts</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/testdb</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.show_sql">true</property> </session-factory> </hibernate-configuration>
步骤2:修复Alien表的主键约束
两种方案可选:
- 方案一(自动生成):临时把
hibernate.hbm2ddl.auto的值改为create,运行一次程序,Hibernate会自动删除旧表,重新创建符合注解配置的新表,aid会自动设为主键。运行完成后改回update避免后续运行清空数据。 - 方案二(手动修改):直接在MySQL命令行执行SQL添加主键约束:
ALTER TABLE Alien ADD PRIMARY KEY (aid);
步骤3:可选优化(自动生成主键)
如果不想每次手动设置aid值,可在Alien类的aid字段上添加主键生成策略注解:
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int aid;
之后插入数据时不需要调用setAid()方法,数据库会自动生成唯一的自增主键。
修复完成后再运行程序,如果重复插入aid=101的记录,会抛出主键重复的异常,符合预期逻辑。
内容的提问来源于stack exchange,提问作者Tanzeel
相关产品推荐
相关产品推荐

