主键自增策略有问题
从一个异常说起
dao 层设置如下
@Table(name = "wxorder_product_category")
@Entity
@Data
public class ProductCategory{
@Id
@GeneratedValue
private Integer categoryId;
private String categoryName;
private Integer categoryType;
}
然后测试添加一条数据时,抛出异常。
测试代码
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProductCategoryRepositoryTest{
@AutoWired
private ProductCategoryRepository repository;
@Test
public void saveTest(){
ProductCategory productCategory = new ProductCategory();
productCategory.setCategoryName("夏日甜品");
productCategory.setCategoryType(4);
repository.save(productCategory);
}
}
抛出的异常
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'portal.hibernate_sequence' doesn't exist
原因及解决方案
名称 | 作用 |
---|---|
TABLE | 使用一个特定的数据库表格来保存主键 |
SEQUENCE | 根据底层数据库的序列来生成主键,条件是数据库支持 |
IDENTITY | 主键由数据库自动生成(主要是自动增长型) |
AUTO | 主键由程序控制 |
JPA 使用提供四种主键解决方案。
名称 | 作用 |
---|---|
TABLE | 使用一个特定的数据库表格来保存主键 |
SEQUENCE | 根据底层数据库的序列来生成主键,条件是数据库支持 |
IDENTITY | 主键由数据库自动生成(主要是自动增长型) |
AUTO | 主键由程序控制 |
在指定主键时,如果不指定主键的生成策略,默认为AUTO。
@Id
相当于
@Id
@GenerateValue(strategy = GenerationType.AUTO)
也就是说,当表由Hibernate 创建时使用 AUTO
合适。
当表已存在并且设置主键auto_increment
时,使用@GenerateValue(strategy = GenerationType.IDENTITY)